Bucket



  • Hallo miteinander!

    Ich suche momentan gerade die Fehler aus folgendem Code:

    2e.cpp:

    // 2e.cpp: Hauptprojektdatei.
    
    #include "apple.hpp"
    #include "bucket.hpp"
    #include "stdafx.h"
    
    using namespace System;
    
    int main(void)
    {
      apple first_apple("red");
      apple second_apple("yellow");
      apple third_apple("green");
    
      bucket a_bucket;
      a_bucket.add_apple(first_apple);
      a_bucket.add_apple(second_apple);
      a_bucket.add_apple(third_apple);
    
      a_bucket->print_all_apples();
    
      return 0;
    }
    

    apple.hpp

    #include <string>
    
    class apple
    {
    
      public:
        apple(std::string color_)
          : _color(color_) {}
    
        std::string get_color() {
          return _color;
        }
    
      private:
        std::string _color;
    
    };
    

    bucket.hpp

    #ifndef BUCKET_H
    #define BUCKET_H
    
    #include <vector>
    #include <iostream>
    #include "apple.hpp"
    
    class bucket
    {
    
      public:
        inline void
        add_apple(apple an_apple_)
        {
          _apples.push_back(an_apple_);
        }
    
        inline void
        print_all_apples()
        {
          int index = 0;
    
          for(; index < _apples.size(); ++index)
          {
            std::cout << "apple color: " << _apples[index].get_color() << std::endl;
          }
        }
    
      private:
        std::vector<apple> _apples;
    
    };
    
    #endif // BUCKET_H
    

    Sieht jemand, wo es noch Fehler hat? (..die hat es bestimmt noch..)
    Liebe Grüsse,
    Max



  • Fehlermeldung?



  • Die ist noch recht gross:

    1>2e.cpp(3): warning C4627: "#include "apple.hpp"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.
    1> "StdAfx.h" Direktive hinzufügen oder vorkompilierten Header erneut erstellen
    1>2e.cpp(4): warning C4627: "#include "bucket.hpp"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.
    1> "StdAfx.h" Direktive hinzufügen oder vorkompilierten Header erneut erstellen
    1>2e.cpp(13): error C2065: 'apple': nichtdeklarierter Bezeichner
    1>2e.cpp(13): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'first_apple'
    1>2e.cpp(13): error C3861: "first_apple": Bezeichner wurde nicht gefunden.
    1>2e.cpp(14): error C2065: 'apple': nichtdeklarierter Bezeichner
    1>2e.cpp(14): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'second_apple'
    1>2e.cpp(14): error C3861: "second_apple": Bezeichner wurde nicht gefunden.
    1>2e.cpp(15): error C2065: 'apple': nichtdeklarierter Bezeichner
    1>2e.cpp(15): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'third_apple'
    1>2e.cpp(15): error C3861: "third_apple": Bezeichner wurde nicht gefunden.
    1>2e.cpp(17): error C2065: 'bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(17): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'a_bucket'
    1>2e.cpp(17): error C2065: 'a_bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(18): error C2065: 'a_bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(18): error C2228: Links von ".add_apple" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist ''unknown-type''
    1>2e.cpp(18): error C2065: 'first_apple': nichtdeklarierter Bezeichner
    1>2e.cpp(19): error C2065: 'a_bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(19): error C2228: Links von ".add_apple" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist ''unknown-type''
    1>2e.cpp(19): error C2065: 'second_apple': nichtdeklarierter Bezeichner
    1>2e.cpp(20): error C2065: 'a_bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(20): error C2228: Links von ".add_apple" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist ''unknown-type''
    1>2e.cpp(20): error C2065: 'third_apple': nichtdeklarierter Bezeichner
    1>2e.cpp(22): error C2065: 'a_bucket': nichtdeklarierter Bezeichner
    1>2e.cpp(22): error C2227: Links von "->print_all_apples" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist ''unknown-type''
    1> AssemblyInfo.cpp
    1> Code wird generiert...
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • C++_Anfänger schrieb:

    Hallo miteinander!

    Ich suche momentan gerade die Fehler aus folgendem Code:

    2e.cpp:

    // 2e.cpp: Hauptprojektdatei.
    
    #include "apple.hpp"
    #include "bucket.hpp"
    #include "stdafx.h"
    
    using namespace System;   // gibts nicht, gibt nur namespace std und den brauchst du hier nicht extra anzugeben weil du ja eh std:: ... schreibst
    
    int main(void)
    {
      apple first_apple("red");
      apple second_apple("yellow");
      apple third_apple("green");
    
      bucket a_bucket;
      a_bucket.add_apple(first_apple);
      a_bucket.add_apple(second_apple);
      a_bucket.add_apple(third_apple);
    
      a_bucket->print_all_apples();   // falsch, ein einfacher punkt reicht. den 'pfeil' brauchst du nur wenn dein objekt ein zeiger ist
    
      return 0;
    }
    

    apple.hpp

    #include <string>
    
    class apple // include guards fehlen und du inkludierst das auch insgesamt 2mal
    {
    
      public:
        apple(std::string color_)
          : _color(color_) {}
    
        std::string get_color() {
          return _color;
        }
    
      private:
        std::string _color;
    
    };
    

    bucket.hpp

    #ifndef BUCKET_H
    #define BUCKET_H
    
    #include <vector>
    #include <iostream>
    #include "apple.hpp"
    
    class bucket
    {
    
      public:
        inline void
        add_apple(apple an_apple_)
        {
          _apples.push_back(an_apple_);
        }
    
        inline void
        print_all_apples()
        {
          int index = 0;
    
          for(; index < _apples.size(); ++index)
          {
            std::cout << "apple color: " << _apples[index].get_color() << std::endl;
          }
        }
    
      private:
        std::vector<apple> _apples;
    
    };
    
    #endif // BUCKET_H
    

    Sieht jemand, wo es noch Fehler hat? (..die hat es bestimmt noch..)
    Liebe Grüsse,
    Max

    sonst sehe ich auf den blick keine weiteren fehler

    EDIT: doch, du benutzt precompiled headers, mach die mal aus in den projekt optionen... (den vorkompilierten header -> stdafx.h inkludiert man immer zuerst, aber davon hab ich auch net viel ahnung und selbst immer genug stress damit)



  • Besten Dank für die rasche Antwort!

    Aber was meinst du mit "include guards"?
    Also meinst du einfach, dass
    #include "bucket.hpp"
    fehlt?

    Und was genau inkludiere ich 2mal?

    Genau, auch wenn ich ein neues Projekt öffne setzt es das automatisch schon ein. Auch das "using namespace System;" wird automatisch generiert.
    Weisst du per Zufall, wo / wie ich das ausschalten kann? (ich verwende Visual C++)



  • naja du solltest win32 konsolen projekt wählen und dann leeres projekt

    das mit dem using namespace system; sehe ich zum ersten mal
    sieht en bisschen nach C++/CLI aus...

    include guards sind die ding die du um bucket hast

    #ifndef BUCKET_H
    #define BUCKET_H
    
    // datei inhalt
    
    #endif // BUCKET_H
    

    das ist quasi so, wenn der compiler das sieht macht der sich en häkchen dass das was zwischen den defines steht schon mal irgendwo war, und so übersetzt der das nur einmal (das is schlecht erklärt, google mal lieber hier)

    sowas musst du auch in die apple datei machen

    warum das so ist?
    #include "xyz.abc" heist nichts anderes für den compiler als: "schreibe den dateiinhalt von xyz.abc genau hierhin statt 'include xyz.abc'"

    so und da in c++ alles nur einmal definiert werden darf gibt das halt stress ohne include guards

    ps: alernativ kannst du auch nur #pragma once am anfang jeder datei schreiben (geht aber nur mit visual c++)



  • Vielen herzlichen Dank für die Hilfe und die super Erklärungen!

    Eventuell lassen sich Deine Fehler-Such-Künste hier nochmals anwenden? 🙂

    // 2f.cpp: Hauptprojektdatei.
    
    int main(array<System::String ^> ^args)
    #include <iostream>
    #include <vector>
    
    void add_one_to_all(std::vector<int> numbers_, int index_);
    void print_all(std::vector<int>* numbers_);
    
    int main(void)
    {
      std::vector<int> values;
    
      values.push_back(10);
      values.push_back(20);
      values.push_back(30);
      values.push_back(40);
    
      add_one_to_all(values, values.size() - 1);
    
      print_all(&values);
    
      return 0;
    }
    
    void
    add_one_to_all(std::vector<int> numbers_, int index_)
    {
    
      if() {}
    
      else
      {
        ++numbers_[index_];
        add_one_to_all(numbers_, index_);
      }
    
    }
    
    void print_all(std::vector<int>* numbers_)
    {
    
      for(int index = 0; index < numbers_.size(); ++index)
      {
        std::cout << "numbers[" << index << "] "
                  << " == " << numbers_[index] << std::endl;
      }
    
    }
    


  • C++_Anfänger schrieb:

    Vielen herzlichen Dank für die Hilfe und die super Erklärungen!

    Eventuell lassen sich Deine Fehler-Such-Künste hier nochmals anwenden? 🙂

    // 2f.cpp: Hauptprojektdatei.
    
    int main(array<System::String ^> ^args)   // was is das? das ist C++/CLI, das ist erstens ein anderes forum und zweitens ist das die einzige zeile davon in normalen C++ code
    #include <iostream>
    #include <vector>
    
    void add_one_to_all(std::vector<int> numbers_, int index_);
    void print_all(std::vector<int>* numbers_);
    
    int main(void)
    {
      std::vector<int> values;
    
      values.push_back(10);
      values.push_back(20);
      values.push_back(30);
      values.push_back(40);
    
      add_one_to_all(values, values.size() - 1);
    
      print_all(&values);
    
      return 0;
    }
    
    void
    add_one_to_all(std::vector<int> numbers_, int index_) // numbers wird hier immer neu kopiert LANGSAM UND RESOURCEN FRESSEND
    {
    
      if() {} // offensichtlich willst du das rekursiv implementieren, hier gehört die abbruch bedingung sowas wie 
    // if ( index == 0 ) { ++_number[0];}
    
      else
      {
        ++numbers_[index_];
        add_one_to_all(numbers_, index_);  // und hier sollte index um eins erniedrigt werden um die rekursion zu vollenden (sinn eben dieser ist mal ein ganz anderes thema
      }
    
    }
    
    void print_all(std::vector<int>* numbers_)
    {
    
      for(int index = 0; index < numbers_.size(); ++index) // numbers ist ein zeiger, also muss das so sein: numers->size(), (*number)[index]
      {
        std::cout << "numbers[" << index << "] "
                  << " == " << numbers_[index] << std::endl;
      }
    
    }
    

    so wärs erstmal syntaktisch dann richtig, aber !!! semantisch nicht

    und zwar das problem bei der add one to all funktion:
    erstens ressourcen fressend (speicher und zeit -> kopieren dauert)
    zweitens macht sie auch nicht im geringsten was du willst

    du willst jede zahl in deinem array um 1 erhöhen, aber so wie du das geschreiben hast werden variablen (oder objekte) per (gleichwertige) kopie an eine funktion gegeben (call by value)

    so gibst du eine variable an eine funktion, machst damit alles was du willst, aber die ursprüngliche variable im haupt programm bleibt unangetastet

    du möchtest aber die eigentliche variable verändern
    so musst du dein objekt per referenz oder per zeiger (wie in der print funktion) übergeben, per zeiger hast du danach probleme das ganze richtig zu schreiben (die geshcichte mit dem punkt und dem '->')
    bei call by reference nicht, dort behandelst du das objekt so wie eine ganz normale variable

    deshalb:

    void add_one_to_all(std::vector<int> & numbers_, int index_) // das & heisst call by referenz
    {
      if( index_ == 0) 
      { 
          ++numbers_[0]; 
      }
      else
      {
        ++numbers_[index_];
        add_one_to_all(numbers_, index_-1);
      }
    }
    

    (so kansst du das auch bei der print funktion machen, dort aber vector<int> const & numbers_ schreiben, da du den vector nicht veränderst und auch so gar nicht in die versuchung kommen kannst -> wird vom compiler geblockt)

    mir scheitn du solltest dich noch etwas mehr mit den c++ grundlagen beschäftigen



  • Besten Dank für die Hilfe!

    Ja, das hast du wohl recht. Mein C++-Buch ist noch unterwegs..meine Fragmente stammen bisher alle aus dem Internet o.ä.
    ..aber ein strukturiertes Buch ist definitiv nötig.

    Liebe Grüsse und danke!


Log in to reply