Klassen dynamisch erzeugen



  • Hallo,
    bis jetzt habe ich nur mit Funktionspointern gearbeitet, aber ich möchte jetzt gerne eine Klasse dynamisch erzeugen.
    Irgendwie so was:

    #include "class1.h"
    #include "class2.h"
    
    void main(){
      *dummy test = new *dummy;
      *dummy=class1;
      test.load();
    
      return 
    }
    

    alle klassen enthalten die funktion save().
    Vielleicht weiß ja jemand von euch, wie das funktioniert;



  • Erstmal nimm lieber int main() 😉

    Zum Problem:

    Klasse *ptrAufKlasse = new deineKlasse;
    ptrAufKlasse->load();

    Oder versteh ich was falsch?



  • wahh so

    deineKlasse *ptrAufKlasse = new deineKlasse;
    ptrAufKlasse->load();



  • So soll es aussehen, aber ich weiß erst kurz vor:
    deineKlasse *ptrAufKlasse = new deineKlasse;

    welche Klasse "deineKlasse" ist.

    Vor der zeile soll so was ähnliches stehn:

    switch (i){
    case 1: deineklasse=class1; break;
    case 2: deineklasse=class2; break;
    }
    deineKlasse *ptrAufKlasse = new deineKlasse;
    ptrAufKlasse->load();



  • Klassen sind keine Werte und koennen daher nicht in Variablen abgelegt werden. (Das ist bei einigen anderen Programmiersprachen anders).

    Sowas geht aber:

    Basisklasse *obj;
    switch (...)
    {
      case ...: obj = new Abgeleitet1;
      case ...: obj = new Abgeleitet2;
    }
    obj->load()
    

    wobei Ageleitet1 und Abgeleitet2 von Basisklasse abgeleitet sind. Basisklasse muss dann load() als virtuell deklariert haben.
    Interessant fuer dich ist evtl. das "Factorypattern".

    -Gunnar



  • Sind die möglichen Klassen alle irgendwie verwandt? Wenn ja, dann führe eine Basisklasse mit virtuellen Funktionen ein, von der die übrigen Klassen abgeleitet werden. Dann nimm einen Zeiger vom Typ der Basisklasse. Diesen kannst Du auf alle von der Basisklasse abgeleiteten Klassen zeigen lassen und über ihn die (virtuellen) Methoden aufrufen.

    In etwa so müsste das dann aussehen:

    class BaseClass
    {
    virtuell void do() = 0;
    };
    class Derived : public BaseClass
    {
    virtual void do() {}
    };
    ...
    BaseClass *pBase = NULL;
    if(i == bla)
        pBase = new Dervied;
    else
        pBsae = new [...];
    
    pBase->do();
    

    Edit: Sry, war mal wieder viel zu langsam...



  • Hi, vielen Dank für die Antworten. Es scheint leider nicht so einfach zu gehen, wie ich gehofft hatte, kann man nichts machen.

    Grisu



  • class Auto{};
    class Opel:public Auto{}
    class Audi:public Auto{}
    
    class AutoWerkstatt{
    public:
      virtual Auto*bau_auto()const=0;
      virtual~AutoWerkstatt(){}
    }
    class OpelWerkstatt:public AutoWerkstatt{
    public:
      Auto*bau_auto()const{
        return new Opel;
      }
    }
    class AudiWerkstatt:public AutoWerkstatt{
    public:
      Auto*bau_auto()const{
        return new Audi;
      }
    }
    //...
    void foo(const AutoWerkstatt&werkstatt){
      Auto*brumbrum=werkstatt.bau_auto();
    }
    

    PS:Das sollte keine Schleichwerbung sein 😃



  • Dieses Werkstatt-Beispiel ist auch unter dem Namen "Factory Pattern"/"Fabrikmuster" bekannt. Googlen.


Anmelden zum Antworten