list mit verschiednen Objekten
-
Hallo!
Ist es möglich eine list<> zu erstellen die als Elemente Objekte verschiedener Klassen aufnehmen kann? Wenn ja wie bitte?
MfG
Dosunmu
-
Normalerweise nimmt man dann einen Pointer auf die Basisklasse und fährt Polymorphie.
Sind die Klassen vollkommen unabhängig frage ich mich meistens was die eigentlich in einer gemeinsamen Liste zu tun haben...also bist du dir auch ganz sicher, dass das so passt?

Wenn ja, schau dir mal boost::any aus der Boost-Bibliothek www.boost.org an.
Direkt mit Boardmitteln hast du da keine Chance.
MfG SideWinder
-
Nutzt boost::any keine Boardmittel?
-
Ja, doch klar. Ich meine nur, dass keine direkte Unterstützung vorhanden ist - und genau eine solche scheint der Threadersteller wohl zu suchen.
MfG SideWinder
-
Die vier Klassen sind alle von der selben Klasse abgeleitet. Kannst du mir erklären wie das genau dann geht?
-
Dann willst du Polymorphie einsetzen

list<Basisklasse*> objects; // Liste mit Zeigern auf die BasisklasseWarum Zeiger? Polymorphie funktioniert nur mit Zeigern

Basisklasse* obj1 = new A (); // ein A erstellen Basisklasse* obj2 = new B (); // ein B erstellen list.push_back(obj1); // beide ganz einfach hinzufügen list.push_back(obj2); list<Basisklasse*>::iterator iter = list.begin(); iter->doSmth(); // ruft nicht Basisklasse->doSmth auf sondern A->doSmth // wichtig dabei ist, dass die funktionen brav virtual gemacht wurden // wenn du dir sicher bist ein A in den händen zu haben kannst du auch casten: A* a = dynamic_cast<A*>(*iter); // da wir alle objekte mit new erstellt haben müssen wir sie auch wieder mit delete löschen: list<Basisklasse*>::iterator iter = list.begin(); while(iter != list.end()) { delete *iter; ++iter; }MfG SideWinder
-
Danke für deine rasche Hilfe!
Bei meiner Basisklasse handelt es sich um eine abstrakte Klasse(die wiederum von einer Klasse abgeleitet ist). Ich habs jetzt so gemacht wie du es oben geschrieben hast und ich bekomme keinen Fehler. Jedoch frag ich mich, leg ich bei
Basisklasse* obj2 = new B ();
nicht ein Objekt der abstrakten Klasse an(was ja nicht geht)?
Und noch ne Frage: Wieso funktioniert Polymorphie nur mit Zeigern?
-
1. Welche Fehlermeldung erhältst du? Wir haben keine Kristallkugel im Einsatz

2. Nein, du sagst "new B", nur ist B von Basisklasse abgeleitet und kann deshalb auch an eine Basisklasse zugewiesen werden (Edit: Was unmöglich wäre mit Objekten, nicht aber mit Zeigern, kannst auch Zeiger auf abstrakte Klassen haben)
3. Liegt an der zugrundeliegenden Technik, erstmal die Technologie selber kennenlernen, dann in die Tiefe gehen
MfG SideWinder
-
SideWinder schrieb:
Dann willst du Polymorphie einsetzen

list<Basisklasse*> objects; // Liste mit Zeigern auf die BasisklasseWarum Zeiger? Polymorphie funktioniert nur mit Zeigern

Stimmt ja gar nicht. Polymorphie funktioniert auch mit Referenzen
(*scnr*) (der Grund liegt darin, daß ein Basis* oder Basis& nicht unbedingt ein Basis-Objekt im Hintergrund liegen haben muß, sondern möglicherweise etwas, das von Basis abgeleitet ist - und dann werden die virtuellen Methoden anhand des dynamischen (aka tatsächlichen) Typs dieses Objekts ausgewählt).PS: Der Grund, warum SideWinder's Konstruktion nur mit Zeigern funktioniert, ist ganz einfach: Referenzen lassen sich nicht kopieren und deshalb auch nicht als Container-Elemente verwenden.