0

私は自分の構造体のコピー コンストラクターを書き込もうとしていますが、これが正しく行われていないようです。再帰的にディープ コピーを実行したいのですが、初期化リストで初期化するよう提案され続けており、それもうまく機能していないようです。

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&)
    {
       // ...
    }
};

前もって感謝します。

4

1 に答える 1

6

この無限の再帰を避けるには、null をテストする必要があります。また、RHS ノードでオブジェクトを逆参照する必要があります。

 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)
 {
 }

ただし、これはprevious != next != previous常に保持され、ノードが互いに指していない場合にのみ機能します。これがリンクされたリスト構造である場合、これは機能しません。

私はあなたのノードが一緒に指していると推測しています.ここでやろうとしていることは、1つのノードがコピーされるたびにデータ構造全体を複製することです. その場合、コピーコンストラクターでこれを賢明に行う方法がわかりません。クラスをコピー不可にし、データ構造全体を複製する別の関数を作成することをお勧めします。s の構造がどのように構築されているかについて、より多くのコンテキストを提供していただければNode、より具体的な提案を提供できるかもしれません。

編集

コメントで、これがツリーであり、それpreviousが親ノード ポインターであることを示しました。このコピー コンストラクターは、サブツリーのクローンを作成する必要があります。

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;
}

Node新しいforを割り当てる代わりに、previous空白のままにして、親に設定させることに注意してください。

于 2012-04-15T10:09:08.660 に答える