Objektinstanzen dynamisch erzeugen



  • Hallo zusammen!

    Ich möchte von einer Basisklasse, nennen wir sie A, abgeleitete Objekte dynamisch erzeugen. Mit dynamisch meine ich hier, daß ich kein new B (class B: A) verwenden kann, weil die zu erzeugende Klasse an dieser Stelle variabel ist. Es soll also eine beliebige Klasse erzeugt werden können die von A abgeleitet ist.

    Dazu sind mir bisher zwei Ansätze eingefallen:

    - Eine Funktion mit Rückgabetyp Zeiger auf A. Dem Programmteil, der die Objekte erzeugen können soll, übergebe ich dann einen Zeiger auf eine Funktion die das gewünschte Objekt erzeugt.

    - A bekommt eine virtuelle Methode:

    class A
    {
    virtual A *newClass() = 0;
    }

    class B: A
    {
    virtual A *newClass() { return new B; }
    }

    Über ein Referenzobjekt könnten dann neue Objekte der gewünschten Klasse erzeugt werden.

    Beides gefällt mir nicht, beispielsweise in Java geht das eleganter.

    Gibt es in C++ bessere oder andere Möglichkeiten?

    Viele Grüße
    Thomas



  • Wie geht es denn in Java?

    Für mich sieht es nach dem Design Pattern "Factory" aus.
    Und da macht man es so wie du es vorgeschlagen hast 🙂

    Was gefällt dir daran nicht?



  • Shade Of Mine schrieb:

    Wie geht es denn in Java?

    In Java gibt es ein Objekt das die Klasse repräsentiert und das man z. B. über einen String mit dem Namen der Klasse erhalten kann. Außer type_info sind mir in C++ keine derartigen Metaklassen bekannt, und damit geht es nicht.

    Shade Of Mine schrieb:

    Was gefällt dir daran nicht?

    Im 1. Fall muß ich zu jedem Objekt noch eine Funktion schreiben. Na ja, wenn ich das mit einem Makro mache dann ist der Aufwand erträglich.

    Der 2. Fall gefällt mir noch weniger, weil ich da eventuell Objekte mit all ihren Datenfeldern habe, deren einziger Zweck es ist, andere Objekte ihrer Klasse zu erzeugen.

    Am liebsten wäre mir so etwas wie einen Zeiger auf einen Konstruktor, den ich nur mit einem Zeiger aufrufen muß um dort ein Objekt der entsprechenden Klasse zu erzeugen...



  • @ThAlb

    Außer type_info sind mir in C++ keine derartigen Metaklassen bekannt, und damit geht es nicht.

    jupp, ohne RTI kommst da ned weit, und RTI ist ned sonderlich elegant ...
    Aber Du bist auch ned der erste, der dieses Problem hat ... die Loesung steckt, wie fast immer, im Design.
    Hol dir nen Buch uber DesignPatterns und schau dir die die Object-Fabriken an. Da sind fuer und wieder verschiedener Loesungen nen grosses Thema ...

    Oder benutz die MFC und CObject mit dem DECLARE_SERIALIZE ! 🙂 Das kommt dem Java ansatz etwas naeher ... mit allen Vor und Nachteilen ...

    Ciao ...



  • Rückgaben können in C++ kovariant sein. Das heißt dein Code sollte so aussehen:

    class A 
    { 
    virtual A *newClass() = 0; 
    } 
    
    class B: A 
    { 
    virtual B *newClass() { return new B; } // Hierum geht's
    }
    

    In Java gibt es ein Objekt das die Klasse repräsentiert und das man z. B. über einen String mit dem Namen der Klasse erhalten kann. Außer type_info sind mir in C++ keine derartigen Metaklassen bekannt, und damit geht es nicht.

    Stimmt. C++s Reflektionsmöglichkeiten sind extrem eingeschränkt. Das ist wirklich ein Problem. Java ist da schon wesentlich besser, aber bisher am besten gefällt mir diesbezüglich Objective-C.


Anmelden zum Antworten