Zeiger versch. unbekannter Objekte in einer Liste speichern
-
Hallo
Ist es möglich Pointer auf Objekte verschiedener und zur Zeit des programmierens noch unbekannter
Klassen in einer LinkedList o.ä. zu speichern ?
Wenn ja wie?Ich habs erst über templates versucht und mir eine eigene LinkedList-Klasse geschrieben, die hat auch
gut Funktioniert, aber die konnte halt nur Pointer auf Objekte von immer der selben Klasse speichern.Ich bräuchte aber eine Liste o.ä. mit der es möglich ist Pointer auf Objekte vieler verschiedener Klassen
zu speichern.MfG Nusso
-
Boost::Any könnte das sein, was du suchst.
-
Wenn man unbedingt will, kriegt man das auf irgendeine extrem hässliche Art bestimmt hin. Zum Beispiel mit
void*-Pointern. Oder mit boost::any.Eine gemeinsame Basisklasse wäre aber das Minimum, um sowas einigermaßen akzeptabel zu implementieren.
Es gibt für dein Problem bestimmt eine bessere Lösung, also warum willst du sowas machen?
-
eine gemeinsame Basisklasse geht nicht, da man die Klassen nicht kennt.
Ich hab noch nie mit Boost gearbeitet, das sollte ich mir vll. mal anschauen.Gibt es keine andere Möglichkeit sowas zu lösen ?
-
wie gesagt gibt es die möglichkeit über void* pointer zu gehen - und extra noch mit anzugeben, um welche klasse es sich handelt...
allerdings wird das sehr schnell sehr unübersichtlich:struct my_ptr { X id; void* ptr; }; my_ptr foo; //... switch(foo.id) { case STD_STRING: static_cast<std::string> (ptr)->...; break; case ... ; default: //exception oder so.. }bb
-
ich würd halt gern eine InputKlasse schreiben, die eben diese Pointer speichert und ggf. die Methoden aufruft.
void Add(char pKey, Class& pObj, void(Class::* pMemFunc)(void))so weit klappt alles, jetzt muss ich die Pointer nur noch irgendwie in einer Liste oder einem Array oder sonst was speichern ...
danke an alle für eure Hilfe, ist aber leider noch nicht das nach dem ich gesucht hab.
@unskilled: so etwas in der Art hab ich mir vorgestellt .. aber so wie in deinem Beispiel kann ich das leider nicht benutzen.
-
dann sag mal, was du genau möchtest(nicht womit du es lösen möchtest), dann wird vll jmd nen weg wissen!?
bb
-
Informiere dich mal über boost::bind und boost::function, dann nimmst du einfach eine std::list<boost::function<void ()> > und verwendest boost::bind(&klasse::funktion, objekt) um aus den memberfunktionen boost::function-Objekte zu machen.