gpt4 book ai didi

c++ - 在 C++ 中与复制构造函数作斗争

转载 作者:太空宇宙 更新时间:2023-11-04 15:49:59 25 4
gpt4 key购买 nike

我正在尝试为我的结构写一个复制构造函数,但我似乎没有做对,如果有任何帮助,我将不胜感激。我想递归地做一个深拷贝,但我一直在收到初始化列表中的初始化建议,而且似乎也不太奏效。

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,而是将其留空并让其父级设置它。

关于c++ - 在 C++ 中与复制构造函数作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com