Objekt-Baumstruktur und Kopiekonstruktor.
-
Konstellation (vereinfacht):
class A{ CTypedPtrArray<CPtrArray,A*> m_Childs; public: //Kopiekonstruktor A(A &Scr){ for(int i=0; i< Scr.m_Childs.GetSize(); i++) m_Childs.Add(new A(Scr); } } class B: public A{ int m_iB; public: //Kopiekonstruktor B(B &Scr) : A(Scr){ m_iB= Scr.m_iB; } }
Ich mache eine Tief Kopie des baumes , was auch funktioniert. Problem. die Letzen Knoten (Childs) des Baumes sind B Objekte, welche von A Abgeleite sind.
A
/ \
A A
/ \ / \
B B B Bnun muss ich bei der rekursicen kopie ja wissen wann des letze knoten kommt, das es nich A , sonder B kopiert. mit "dynamic_cast im Kopykonstruktor von A übreproüfen ob Quelle (Scr) es A oder B ist geht nich, da es ja B nich kennt weil B nach A übersetzt wird. Versteht ihr? Zudem ist es evtl. schlecht Design wenn ich überhaupt checkenb muss welcher Typ klasse es ist?
Vorschläge lösungen?
-
wie wärs mit einer virtuellen Clone() 0-Funktion in A?
Abgeleitete klassen leiten davon ab? und geben kopien von sich selbst zurück.
-
-> coole Idee;) Menno mir fallen nie so dinge ein:)
Steh aber allerdings grad bischen aufm schlauf wie ich das machen soll....
-
geh mal schlafen, vielleicht fällt dir dann noch mehr ein.
-
keine zeit zum schlafen....
-
Ich bekomm das mit den virtuellen Clone Funktionen hinsichtlich der Problem stellung nich auf die reihe!! HILFE
-
BorisDieKlinge schrieb:
Ich bekomm das mit den virtuellen Clone Funktionen hinsichtlich der Problem stellung nich auf die reihe!! HILFE
Vielleicht solltest Du Dich erstmal mit Initialisierungslisten und const-correctness beschäftigen. Wenn man das beachtet, ist der Rest doch einfach:
class A { CTypedPtrArray<CPtrArray,A*> m_Childs; public: A() : m_Childs() {} //Kopiekonstruktor A( const A& Scr ) : m_Childs() { for(int i=0; i< Scr.m_Childs.GetSize(); i++) m_Childs.Add( Scr.m_Childs[i]->clone() ); // ich unterstelle mal dass das komische CTypedPtrArray<> einen operator[] hat. } virtual A* clone() const { return new A( *this ); } void Add( A* p ) { m_Childs.Add( p ); } }; class B: public A { int m_iB; public: explicit B( int iB = 0 ) : A() , m_iB( iB ) {} //Kopiekonstruktor braucht's hier gar nicht virtual A* clone() const { return new B( *this ); } };
.. und vergiss nicht die 'Regel der drei'. Destruktor und Assignment-operator müssen in der Klasse A noch berücksichtigt werden.
Gruß
Werner
-
hey danke... hab die ganze sache glaub um paar ecken rum gedacht;)