Objekt dynamisch erzeugen, aber Klasse erst zur Laufzeit aussuchen...



  • Hi,
    mir stellt sich gerade folgendes Programmierproblem:
    ich besitze zwei Klassen, die dieselben Methoden enthalten(dieselben Methodennamen,...), aber in den Methoden unterschiedliche Implementierungen besitzen.

    Nun würde ich gerne zur Laufzeit meines Programmes ein Objekt aus einer dieser Klassen dynamisch erzeugen und dann ganz normal damit arbeiten. Aus welcher Klasse dieses Objekt erzeugt werden soll, ergibt sich allerdings erst zur Laufzeit.

    Mein Lösungsansatz war dementsprechend:

    cKlasse1* cObj;
    
    if(irgendwas){
        cObj = new cKlasse1();
    }else{
        cObj = new cKlasse2();
    }
    
    cObj->TuWas();
    

    Ich dachte, da es sich (nach aussen) um dieselben Klassen handelt, könnte ich mit nur einem (globalen) Pointer beide Fälle abdecken.

    Leider klappt dieser Ansatz nicht, fällt euch evtl. eine anderer Lösungsweg ein?



  • Erzeuge eine abstrakte Basisklasse und leite beide Klassen davon ab, die benötigten Methoden machst du dann virtual.



  • [Edit] Vergesst es...[/Edit]

    Könntest das doch auch per union machen.



  • mach doch nur eine klasse

    class Klasse
    {
       Klasse:Klasse(int iTyp)
       { 
          switch(iTyp)
          {
             case 1:
                //Klasse typ 1 initialisieren
             break;
             case 2:
                //Klasse typ 2 initialisieren
             break;
    
          }
       };
    };
    
    Klasse Obj;
    if (irgendwas)
    {
       Obj = new Klasse(1);
    }
    else
    {
       Obj = new Klasse(2);
    }
    
    Obj->TuWas();
    


  • Hallo

    Ein polymorphe Basisklasse ist das beste für diese Situation. Und unions sollte man ausschließlich für Basistypen (POD) einsetzen.

    bis bald
    akari



  • @TH
    Klingt gut, der Pointer, um auf eine der Abgeleiteten Klassen zuzugreifen, ist dann vom Typ der Basisklasse?

    @BigNeal:
    Wäre eine möglichkeit, die beiden Klassen sind allerdings recht umfangreich.
    Und beide existieren schon, der Aufwand, beide Klassen zu einer zusammenzuführen, ist recht heftig.



  • Hallo SilentSurfer,

    genau der Pointer ist dann vom Typ der Basisklasse, also

    cBasisKlasse* cObj; 
    
    if(irgendwas){ 
        cObj = new cKlasse1(); 
    }else{ 
        cObj = new cKlasse2(); 
    } 
    
    cObj->TuWas();
    

    Wenn du dann doch spezielle Methoden einer Klasse aufrufen willst, kannst du dann entsprechend casten, z.B.

    if(irgendwas)
      static_cast<cKlasse1*>(cObj)->TuWasSpeziellesNurFuerKlasse1();
    

    Dies sollte aber nicht zu häufig vorkommen sein, ansonsten auch diese Methode virtual machen, und in der Basisklasse mit {} definieren. Dann brauchst du sie in der anderen Klasse nicht zu definieren.



  • SilentSurfer schrieb:

    cKlasse1* cObj;
    
    if(irgendwas){
        cObj = new cKlasse1();
    }else{
        cObj = new cKlasse2();
    }
    
    cObj->TuWas();
    

    🙄

    öhm... sollte bei

    cObj = new cKlasse2();
    

    nicht n Compilerfehler kommen weil
    der Pointer *cObj vom Typ cKlasse1 ist?

    also ich würd ja auch ne abstrakte basisklasse machen, von der ableiten und
    dann den pointer von der basisklasse erstellen und diesen mittels new
    operator dann ein Objekt anheften, welches den abgeleitetn klassen entspricht.
    wenn de dann die methode in den abgeleiteten klassen implementierst dann
    nimmt der automatisch die richtige... also in der basisklasse ne virtuelle
    und in der abgeleiteten dann die definition der methode

    mfg

    mightymop



  • SilentSurfer schrieb:

    @BigNeal:
    Wäre eine möglichkeit, die beiden Klassen sind allerdings recht umfangreich.
    Und beide existieren schon, der Aufwand, beide Klassen zu einer zusammenzuführen, ist recht heftig.

    in diesem fall, wie schon oft erwähnt eine Basisklasse und davon ableiten.. 🙂



  • Th schrieb:

    Wenn du dann doch spezielle Methoden einer Klasse aufrufen willst, kannst du dann entsprechend casten, z.B.

    if(irgendwas)
      static_cast<cKlasse1*>(cObj)->TuWasSpeziellesNurFuerKlasse1();
    

    Statt des static_casts solltest du besser dynamic_cast nehmen, schließlich ist er speziell für Down-Casts gedacht. 🙂



  • Statt des static_casts solltest du besser dynamic_cast nehmen, schließlich ist er speziell für Down-Casts gedacht.

    Aber nur, wenn er bei seinem Compiler auch RTTI eingeschaltet hat...


Anmelden zum Antworten