Queue mit polymporphen Objekten
-
Moin,
habe folgendes Problem. Ich möchte ne QueueKlasse haben die polymporphe Objekte speichern kann. Ich weiß leider nicht was schief läuft, beim dynamic_cast bringt er ne exception.
Gibt es die Möglichkeiten die Queue auch mit Referenzen zu machen ?
class Interface{ public: virtual ~Interface(){}; int getMember() const {return m_number;}; virtual void doit () const =0; private: int m_number; protected: Interface():m_number(4){}; }; class Implementation1 : public Interface{ public: void doit() const { std::cout << this->getMember() << std::endl;}; }; class Implementation2 : public Interface{ public: void doit()const { std::cout << "Zahl" << this->getMember();}; }; class DerivedQueue{ public: DerivedQueue(){}; void push(const Interface* object){m_queue.push(object);}; const Interface* pop(){return m_queue.front();}; private: std::queue<const Interface*> m_queue; }; const Interface* subroutine(); int main () { DerivedQueue testQueue; const Interface* param = subroutine(); testQueue.push(param); const Interface* check = testQueue.pop(); dynamic_cast<const Implementation1*>(check)->doit(); return 1; } const Interface* subroutine() { const Implementation1 test; const Interface* check = &test; return check; }
-
mrtrashtalk schrieb:
const Interface* subroutine() { const Implementation1 test; const Interface* check = &test; return check; }du gibst die adresse eines automatischen objekts zurück - dieses wird aber beim verlassen des blocks zerstört, dynamisc_cast benötigt allerdings ein lebendes objekt. sollte wohl static sein?
-
Kann ich das Objekt nur erhalten wenn die Subroutine in ner Klasse ist und ich gebe ne Adresse auf ein Member zurück ? Oder geht das noch anders ?
-
Hallo
ein Member einer Klasse ist eine Möglichkeit.
Eine andere Möglichkeit ist das erstellen einer dynamischen Instanz mit new.
Dann must du diese aber auch wieder außerbalb manuell wieder mit delete löschen.bis bald
akari
-
Okay vielen Dank, mit new und delete haut es hin. Nochmal zu der Frage mit den Referenzen, geht das auch, oder muss eine Referenz immer auf einen konkreten Typen verweisen ?
-
Hallo
eine Referenz ist nur ein Zeiger, der bei der Initialisierung auf eine gültige Instanz festgelegt wird und dann nicht auf andere adressen mehr geändert werden kann. Vom technischen Ablauf ist dann aber kein Unterschied mehr.
bis bald
akari
-
hallo,
auf den dynamic_cast kannst du auch verzichten. immerhin hast du die methode doit ja schon in der superklasse deklariert. virtuell.
jenz