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 Basisklasse
    

    Warum 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 Basisklasse
    

    Warum 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.


Anmelden zum Antworten