0

二重リンク リストのノードのコピー代入演算子を作成しようとしています。ただし、次のコードでスタック オーバーフローが発生します。

template <class DataType>
ListNode<DataType>& ListNode<DataType>::operator=(const ListNode<DataType>& Node)
{
if(this == &Node)
    return *this;
else
{
    if(Child != NULL)
        delete Child;
    if(Parent != NULL)
        delete Parent;

    if(Node.Child != NULL)
    {
        Child = new ListNode<DataType>();
        *Child = *Node.Child;
    }
    else
        Child = NULL;

    if(Node.Parent != NULL)
    {
        Parent = new ListNode<DataType>();
        *Parent = *Node.Parent;
    }
    else
        Parent = NULL;

    _data = Node._data;
}
return *this;
}

このようなノードをコピーする標準的な方法は何ですか?これを実現するには、他の手段 (つまり、コピー代入演算子ではない) を使用する必要がありますか? 既存のプログラムを大量に書き直す必要があるため、できるだけ避けたかったのです。この関数は、単独でリンクされたリストではうまく機能するようですが、親ポインタのコピーを追加すると、問題が発生するようです。理由を特定することも、この関数を記述する別の方法を考えることもできないようです。

4

2 に答える 2

0

parent名前をpreviouschildに変更することをお勧めしますnext。それらが実際に何を意味するのかを明確にするためです。木に適しているようですParentchild

if(Node.Child != NULL)
{
    Child = new ListNode<DataType>();
    *Child = *Node.Child;
}

これはListNode<DataType>::operator=2 番目の割り当てで呼び出されることに注意してください。子チェーン全体がコピーされるまで、何度も何度も呼び出されます。

親も同じです。

if(Node.Parent != NULL)
{
    Parent = new ListNode<DataType>();
    *Parent = *Node.Parent;
}

つまり、基本的にリスト全体を複製しただけです。


あるノードを別のノードにコピーするだけの場合。valueノードに をコピーするだけです。実際のノードではありません。実際のノードを複製しても意味がないと思います。

たとえば、リンクに が含まれていintて、5thメンバーをメンバーにコピーする場合は、ノードの int8thの値をコピーするだけです。

于 2013-04-12T20:10:39.377 に答える