2012-04-15 9 views
0

Ich versuche, mir einen Kopierkonstruktor für meine Struktur zu schreiben, aber ich scheine das nicht richtig zu machen und würde mich über jegliche mögliche Hilfe freuen. Ich möchte rekursiv eine tiefe Kopie machen, aber ich bekomme immer Vorschläge in der Initialisierungsliste zu initialisieren, und das scheint auch nicht gut zu funktionieren.Ich kämpfe mit Kopierkonstruktoren in C++

struct Node 
{ 
    Node* left; // will be our previous 
    Node* right;// will be our next 
    Node* previous;// get a handle to the previous node 
    string value; 

    Node(string nval): left(NULL), right(NULL), previous(NULL), value(nval) 
    { 

    } 

    Node(Node const& node) 
    : previous(new Node(node.previous)), 
     left(new Node(node.left)), 
     right(new Node(node.right)), 
     value(node.value) 
    { 
    } 

    Node& operator=(const Node&) 
    { 
     // ... 
    } 
}; 

Vielen Dank im Voraus.

+1

'neuer Knoten (node.previous)': 'previous' ist ein Zeiger, aber Ihre' Node' Klasse hat keinen Konstruktor, der einen Zeiger verwendet. (Das gleiche gilt natürlich auch für die anderen.) – sbi

+0

und was ist, wenn node.left NULL ist? Was erwarten Sie von "neu" für Sie? Tun Sie dies nicht in der Initialisierungsliste. Sie haben einen Körper für Ihren Konstrukteur - tun Sie es dort. – littleadv

+0

Und die Klammern sehen alles falsch aus. – Mat

Antwort

6

Um diese Rekursion unendlich zu vermeiden, müssen Sie auf Null testen. Sie müssen auch die Objekte im RHS-Knoten dereferenzieren.

Node(Node const& node) : 
    previous(node.previous ? new Node(*node.previous) : NULL), 
    left(node.left ? new Node(*node.left) : NULL), 
    right(node.right ? new Node(*node.right) : NULL), 
    value(node.value) 
{ 
} 

Aber das wird nur funktionieren, wenn previous != next != previous immer hält, und die Knoten weisen nicht zueinander. Wenn dies eine verkettete Listenstruktur ist, wird dies nicht funktionieren.

Ich vermute, dass Ihre Knoten zusammen zeigen, und was Sie hier versuchen, ist, eine ganze Datenstruktur zu klonen, wann immer ein Knoten kopiert wird. In diesem Fall sehe ich keine Möglichkeit, dies in einem Kopierkonstruktor sinnvoll zu machen. Ich würde vorschlagen, die Klasse nicht kopierbar zu machen und eine separate Funktion zu schreiben, um die gesamte Datenstruktur zu klonen. Wenn Sie mehr Kontext dafür angeben, wie Ihre Struktur von Node aufgebaut ist, kann ich möglicherweise einen konkreteren Vorschlag liefern.

bearbeiten

angezeigt Sie in den Kommentaren, dass dies ein Baum ist, und dass previous ist der übergeordnete Knoten Zeiger. Dieser Copykonstruktor sollte einen Teilbaum Klon tun:

Node(Node const& node) : 
    previous(NULL), 
    left(node.left ? new Node(*node.left) : NULL), 
    right(node.right ? new Node(*node.right) : NULL), 
    value(node.value) 
{ 
    if (left) 
     left->previous = this; 
    if (right) 
     right->previous = this; 
} 

Beachten Sie, dass statt eines neuen Node für previous Zuweisung es es leer lässt und lässt seine Eltern es eingestellt.

+0

@LuchianGrigore: Weißt du, dieser ganze Vorfall würde nicht so stark riechen, wenn du nicht gesagt hättest, dass du nachher genau den gleichen Code gepostet hast (eine Sekunde nach diesem). – sbi

+0

Ich verstehe nicht, was Sie meinen, wenn vorherige! - nächste! - vorherige. Ich benutze dies für einen Baum, wo ich einen Zeiger auf die Elternknoten, linken und rechten Kindknoten halten. Warum würde das obige nicht funktionieren? Was würde ich zusätzlich tun müssen, um das zu erreichen, sagen wir, jeden Knoten jedes Mal kopieren, wenn er aufgerufen wird? – Kobojunkie

+0

@Kobojunkie by 'previous! = Next! = Previous' Ich meine, dass diese drei Zeiger alle auf verschiedene Objekte zeigen. Wenn dies ein binärer Baum ist, ist "vorheriger" der Elternzeiger? wenn nicht was ist es? – je4d

Verwandte Themen