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 B

    nun 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;) 🙂


Log in to reply