Objekte speichern
-
Du solltest dich auch fragen, ob du wirklich einen Vektor mit Zeigern brauchst. Javeprogrammierer neigen bei C++ dazu alles mit "new" auf dem Heap zu allokieren, was oft nicht nötig ist.
-
Du meinst also einfach ein Array von Zeigern verwenden, die auf die Bäume zeigen.
Wie würde das gehen?lg und Danke
-
Er meint eher direkt die Bäume und nicht deren Zeiger in den vector zu legen

-
und wie kann ich das am Besten machen?
lg
-
Etwa so:
class Plantage { public: ... void pflanzen(const ObstBaum& baum) { m_baeume.push_back(baum); } ... private: vector<ObstBaum> m_baeume; };
-
Hallo,
ich lies jetzt wie unten gezeigt aus dem vector in einer for- Schleife aus.
Mein Problem ist, dass baeume[i].zeigen() nicht funktioniert, was muss ich da machen damit das geht??Vielen Dank und lg
std::vector<ObstBaum*> baeume; void Plantage::pflanzen(ObstBaum *baum) { baeume.push_back(baum); } void Plantage::zeigen() { for (int i = 0; i < baeume.size(); i++) std::cout << baeume[i].zeigen() << std::endl; }ich bekomme folgende Fehlermeldung:
er linke Teil von '.zeigen' muss eine Klasse/Struktur/Union sein
-
std::vector<ObstBaum*> baeume; // wenn es wirklich Zeiger sein müssen, dann informier dich mal über Smartpointer, // die nehmen dir das Freigeben des Speichers ab (du musst nicht selbst delete aufrufen) void Plantage::pflanzen(ObstBaum *baum) { baeume.push_back(baum); } void Plantage::zeigen() { for (int i = 0; i < baeume.size(); i++) // informier dich mal über Iteratoren std::cout << baeume[i]->zeigen() << std::endl; // Wenn du Zeiger verwendest musst du auch den richtigen Operator verwenden }
-
Jetzt bekomme ich folgende Fehlermeldung:
Keine Ahnung was ich da falsch mache,
Ich habe eine Klasse Baum, in der zeigen deklariert ist , die Klasse Obstbaum erweitert Baum und die Klassen Apfelbaum und Birnenbaum erweiteren Obstbaum,
Hats da was mit virtual oder so, Die Methode zeigen in der Klasse Baum habe ich schon virtual ge,acht, was aber auch nichts hilft,Vielleicht hat jemand noch eine Tipp für mich,
lg
ObstPlantage.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual void __thiscall Baum::zeigen(void)" (?zeigen@Baum@@UAEXXZ) Debug/ObstPlantage.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
-
Vielleicht solltest du die Methoden der Basisklasse auch irgendwo definieren - oder als pur virtuell anlegen:
//Variante 1: class Baum { ... public: virtual string zeigen() const; }; string Baum::zeigen() const { return "unbekannter Baum"; } //Variante 2: class Baum { ... public: virtual string zeigen() const = 0;//pur virtuell - damit wird die Basisklasse abstrakt };
-
Vielen Dank!! es funkt
-
PollerCPP schrieb:
std::vector<ObstBaum*> baeume; // Das ist gar nicht gut, vor allem für Java Entwickler void Plantage::pflanzen(ObstBaum *baum) { baeume.push_back(baum); } void Plantage::zeigen() { for (int i = 0; i < baeume.size(); i++) std::cout << baeume[i].zeigen() << std::endl; }Wie verwaltest Du die Objekte von Typ ObstBaum? STL Container sind für die Speicherung by Value und nicht by Pointer ausgelegt. Wenn Du die Objekte wirklich im Container baeume verwalten willst, solltest Du tunlichst einen passenden SmartPointer wählen. Z.B. so
std::vector<boost::shared_ptr<ObstBaum> > baeueme;Andernfalls produzierst Du massenweise Speicherleichen.
-
CStoll schrieb:
Vielleicht solltest du die Methoden der Basisklasse auch irgendwo definieren - oder als pur virtuell anlegen:
//Variante 1: class Baum { ... public: virtual string zeigen() const; virtual ~Baum(); // den hier nicht vergessen };Da es sich um ein C++ Neuling handelt sollte man den virtuelle Destruktor nicht vergessen, und am besten ergänzt man bei ihm gleich "throw ()".