视觉 在C++中与复制构造函数作斗争
visual Struggling with Copy Constructors 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&)
{
// ...
}
};
提前谢谢。
为了避免这种无限递归,您需要测试 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
,而是将其留空并让其父级设置它。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 视觉 在C++中与复制构造函数作斗争