视觉 在C++中与复制构造函数作斗争

visual Struggling with Copy Constructors in C++

本文关键字:构造函数 斗争 复制 C++ 视觉      更新时间:2023-10-16

我正在尝试为我的结构编写一个复制构造函数,但我似乎没有做到这一点,请提供任何可能的帮助。我想递归地做一个深度复制,但我不断收到在初始化列表中初始化的建议,这似乎也没有很好地工作。

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

提前谢谢。

为了避免这种无限递归,您需要测试 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始终成立并且您的节点不相互指向的情况下才有效。如果这是链表结构,则不起作用。

我猜你的节点确实指向在一起,你在这里要做的是每当复制一个节点时克隆整个数据结构。在这种情况下,我看不到您可以在复制构造函数中明智地执行此操作的方法。我建议使该类不可复制,并编写一个单独的函数来克隆整个数据结构。如果您提供更多关于如何构建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;
}

请注意,它不是为 previous 分配新的Node,而是将其留空并让其父级设置它。