Anfänger: Typ bei virtuellen Funktionen
-
Hallo,
ich habe folgendes, an siche recht simple Klassendesign:
IDrawAction (abstrakte, nicht instanzierbare Klasse)
↑
IconAction1 (abgeleitete Klassen, die die virtuellen Funktionen überschreibt) → IconAction2 → IconAction3 → IconAction...Nun habe ich einen Zeiger ptrAction vom Typ des Interfaces: IDrawAction*.
ptrAction zeigt nun entweder auf eine Klasse vom Typ IconAction1 oder IconAction2.Ich möchte nun ein neues Objekt erstellen, das vom gleichen Typ ist wie das Zeigerziel von ptrAction.
A la:IDrawAction *Neu = new Typ_der_Klasse(ptrAction);Vielleicht gibt es ja eine Funktion, die den Typ einer Klasse zurückgibt und man das Ergebnis gleich im new-Teil verwenden kann.
Das ganze wird aber noch dadurch erschwert das hier noch Vererbung verwendet wird.Puuh, ist das blöd zu erklären

Ich hoffe jemand versteht trotzdem was ich meine und kann mir helfen
-
hmm, du könnstest notfalls in einer variable den typ speichern und den abfragen
z.b.
m_status;
und dann jeweils im konstructor
m_status = 1 oder 2 z.b. automatisch setzen
-
Einfache Lösung:
Verpass dem Interface eine virtuelle, abstrakte Methode clone().
Die entsprechenden Klassen müssen dann selber wissen, wie sie sich replizieren.
-
kannst du mit dynamic_cast machen
-
Jup, ich denke, ich verstehe dich. Was du gern hättest ist ein u.a. ein sogenannter virtueller Konstruktor (auch Factory Method). Hierfür gibt es entsprechende Muster bzw. Pattern (such nach den Stichwörtern für weitere Infos).
Hier eine Kurzbeschreibung des Prinzips:
class A {
virtual A* clone(){ return new A(*this) };
}class b : public A {
virtual A* clone(){ return new B(*this) };
}void f(){
A* ap = new B();
A* toB = ap->clone(); // ap erzeugt ein Objekt vom Typ B*}
Die virtuelle Funktion liefert durch die passende Überschreibung jeweils ein Objekt des Typs, für den sie tatsächlich aufgerufen wurde.
Die Funktion clone() muss natürlich nicht zwingend eine Kopie erzeugen. Es kann auch ein default-Objekt erzeugt werden.Hoffe das hilft
-
Ja du kannst eine rein virtuelle fkt machen
so eine
CxxxxTableLtf
dann die adapterklassen CTableA CTableB
dann kannst du geschickterweise eine CxxxxFactory klasse machen
in hast du ein enum für die typen und hast am besten eine get und set methode
z.b. SetStrategy( )
Diese hast du in deinem Programm dann ( die factory klasse ) und die bestimmt dann was aufgerufen wird
wenn du einen anderen adapter brauchst musst du nur das enum erweitern in der SetStragety dies reinmachen und die adapterklasse programmieren. so musst du in zukünftigen programmen sehr wenig bis nichts vom bestehenden code ändern.
-
Danke, ich find die Art der Lösungen mit dem "Factoring" wunderschön.
Hab zwar inzwischen mit RTTI und dynamic_cast experimentiert, aber dabei entsteht äußerst gräßlicher Code.
Vielen Dank !