Dynamisch Objekttypen zur Laufzeit festlegen



  • Hallo,

    weiss jemand wie ich in C++ eine Instanz zur Laufzeit anlegen kann, deren Typ aber erst zur Laufzeit bekannt ist?
    In Java dürfte das das Thema Reflection sein. Aber Java nützt mir hier nix.



  • Da normalerweise die Instanzen die du anlegen möchtest etwas miteinander zu tun haben, könntest du eine Basisklasse erstellen und dann je nach Bedingung eine abgeleitete Klasse erstellen:

    Base *Instanz;
    
    if(diesebedingung())
       Instanz = new Ableitung1;
    else if(eineanderebedingung())
       Instanz = new Ableitung2;
    
    //Mach was mit Instanz
    


  • Hm, hört sich für mich nach Templates an...

    Devil



  • templates werden zur compile-zeit ausgewertet 😡



  • Original erstellt von KPC:
    **Da normalerweise die Instanzen die du anlegen möchtest etwas miteinander zu tun haben, könntest du eine Basisklasse erstellen und dann je nach Bedingung eine abgeleitete Klasse erstellen:

    Base *Instanz;
    
    if(diesebedingung())
       Instanz = new Ableitung1;
    else if(eineanderebedingung())
       Instanz = new Ableitung2;
    
    //Mach was mit Instanz
    

    **

    Ja aber bei ca. 50 Klassen habe ich eine entsprechend grosse if-else-Auswertung. Diese will ich vermeiden.

    De facto hat das auch nix mit Templates zu tun.

    Ich werd am besten meine Frage umformulieren:

    Gibt es irgendeine gute (eigentlich muss die nichtmal gut sein) Variante Reflection in C++ umzusetzen?



  • Mir ist nichts derartiges in C++ bekannt. Das wird aber den einfachen Grund haben, das im Gegensatz zu Java, der erzeugte Code auf kompletter Maschinenebene liegt. In Java ist dies nicht der Fall, da lässt sich der Bytecode sogar fast 1:1 zurück compilieren. Und somit kann auch die JVM entsprechend in der Runtime Objekte erzeugen. Weiterhin hat in Java jede Klasse als Basisklasse "Object", was in C++ nicht der Fall ist. Es würde immer und überall knallen und somit nicht wirklich viel Sinn machen

    Das ganze würde in C++ möglich sein, wenn es denn einen Compiler gäbe, der entsprechend Code erzeugen würde. Da es aber im C++-Standard nicht vorhanden ist, ist das wohl eher unwahrscheinlich. Ich konnte jedenfalls in meinem C++ vom C++-Erfinder nichts darüber finden.

    Wer etwas anderes weiß, soll sich bitte melden.


Anmelden zum Antworten