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


Anmelden zum Antworten