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 methodemfg
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...