Klassen dynamisch erstellen



  • Hallo,
    habe ein kleines Problem, zu dem ich leider noch nirgens was gefunden habe. Leider weiß ich noch nicht mal, ob das überhaupt geht, aber vielleicht hat ja jemand von Euch einen Tipp.

    Zur Sache:

    Ich möchte in einem Programm dynamisch Klassen erstellen, von denen ich vorher praktisch nichts weiß. Ich habe also beispielsxweise ein Verzeichnis in dem ich mehrere kompilierte Klassen habe. Nun soll das Hauptprogramm in diesem Verzeichnis schauen und von jeder Klasse darin eine Instanz erzeugen und ausführen.

    Irgendjemand eine Idee, wie ich das erreichen könnte? Die Dateinamen auszulesen ist kein Problem, aber die Klassen erstellen..... 😕

    Viele Grüße,
    Chris



  • Du bringst hier Klassen und Instanzen durcheinander. Es ist ein gigantischer Underschied, ob du zur Laufzeit eine Klasse oder eine Instanz einer Klasse erstellen willst.
    Für den Fall, dass du zur Laufzeit verschiedene Objekte instantiieren willst, könntest du das über das Factory-Pattern erledigen. Jede deiner Klassen implementiert ein Interface (in C++ ne abstrakte Klasse mit lauter pure virtual methods) und gegen dieses Interface programmierst du dann. Vom Prinzip sieht das dann so aus:

    class A : public Interface {
       /* ... */
    };
    
    class B: public Interface {
       /* ... */
    };
    
    Interface* i = getInstance();  // In getInstance liest du jetzt dein Verzeichnis aus und erstellst je nach Bedarf Klassen, die Interface implementieren
    i->machDies();
    i->machDas();
    


  • Crizzly schrieb:

    Nun soll das Hauptprogramm in diesem Verzeichnis schauen und von jeder Klasse darin eine Instanz erzeugen und ausführen.

    erzeugen heißt, daß sie nen konstruktor hat und ausführen bedeutet, daß sie ne run()-methode hat.
    für leichteren zugriff isses warscheinlich nett, wenn sie alle von einer basisklasse erben.
    mach *.dll oder *.so als dateien auf die platte. jede datei hat ne globale funktion run(), die hat innendrin einfach {static Klasse k; k->run();} und schon klappt's.



  • Crizzly schrieb:

    Ich möchte in einem Programm dynamisch Klassen erstellen, von denen ich vorher praktisch nichts weiß. Ich habe also beispielsxweise ein Verzeichnis in dem ich mehrere kompilierte Klassen habe. Nun soll das Hauptprogramm in diesem Verzeichnis schauen und von jeder Klasse darin eine Instanz erzeugen und ausführen.

    verstehe ich das richtig? du hast sowas wie .obj-files? und willst die dynamisch instanzieren? ich glaube, da musst du teilweise die funktionalität eines linkers nachbilden, der das format kennt. stell' ich mir erstmal schwierig vor



  • Hi,

    zunächst mal viewlen Dank für die vielen schnellen Antworten.
    @interpreter: Ich meinte natürlich Instanzen - sorry da habe ich mich wohl falsch ausgedrückt.

    Auf jeden Fall waren schon einige Tipps dabei, die mir sicherlich weiter helfen. Vielen Dank,
    Chris



  • Ich hab das so gemacht, dass ich in der .so/.dll Datei eine Factory Klasse habe, die mir das Objekt erstellt.

    Ich kann dir den Code aber auch schicken (ist für Linux/Unix (POSIX) und Win32) und recht übersichtlich und auch komfortabel (erzeugte Plugins werden via Smart Pointer einfach kopiert und gelöscht und es gibt ein Factory Template, so dass du nur plugin_factory<pluginklasse> factory; machen musst um dir die Factory zu basteln etc.)


Log in to reply