Klassenaufruf basierend auf String
-
Hallo!
Ich würde gerne folgendes machen:
In einem XML-File habe ich eine Liste von Klassen, die alle auf dem selben Interface basieren.
Jetzt möchte ich während der Laufzeit unterschiedliche Klassen aufrufen.
Also z.B. (pseudo-code):MyInterface * x; // So mache ich es im Moment (1): if (xmlfile->getClassName() == "Class1") x = new Class1(); if (xmlfile->getClassName() == "Class2") x = new Class2(); //So hätte ich es gerne (2): x = new xmlfile->getClassName().toClass();Geht sowas irgendwie in C++. In Java ging sowas problemlos...
Danke,
-
Jo gibts auch. Mit operator typeid.
Gruß
-
ich glaube, dass wir von 2 unterschiedlichen sachen reden. was ich meine ist, dass ich quasi aus einem string heraus eine klasse initilisiere.
also xml->getClassName() hat nur einen String und und die toClass methode macht irgendwie sowas:
x = new Class("xml->getClassNameAsString()");
Mir fällt jetzt aus dem kopf heraus nicht ein, wie das in java ging, aber in PHP sieht das z.b. so aus:
$x = "Class1"; $y = new $$x; // Erzeugt eine neue Instanz der Klasse Class1
-
In C++ hast du keinen Laufzeitzugriff auf solche Meta-Informationen wie Klassennamen und deren Methoden, etc. Das ist zB in Java anders.
Eine Möglichkeit wäre zB eine Factory zu bauen:
BaseClass* CreateDerived (const char* name) { if(strcmp("DerivedA",name)==0) return new DerivedA(); return new DerivedB(); }MfG SideWinder
-
- nix -
-
@FireFlow - in dem falle kann es ned zur compile-time feststehen ...
/edit
@FireFlow - einfach wegmachen ist feige ;P
-
wie schon erwähnt, funktioniert das so nicht
x = new xmlfile->getClassName().toClass();so gehts in der realität:
//eine Beispielfunktion X* createClass1(){ return new Class1(); } //vorbereitungen std::map<std::string,X*(*)()> create; create.push_back(std::make_pair("Class1",createClass1)); //aufruf X* x=create[xmlfile->getClassName()]();
-
danke. das hilft mir sehr weiter, da es einige dinge etwas vereinfacht und weniger redundant (vom code her) macht.
