我正在尝试为我的结构编写一个复制构造函数,但我似乎没有做到这一点,并希望得到任何可能的帮助.我想以递归的方式做一个深层复制,但是我一直在初始化初始化列表中得到建议,这似乎也没有好转.
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&)
{
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
提前致谢.
为了避免无限次递归,您需要测试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)
{
}
Run Code Online (Sandbox Code Playgroud)
但这只有在previous != next != previous总是成立时才会起作用,并且您的节点不会相互指向.如果这是一个链表结构,这将不起作用.
我猜你的节点确实在一起,而你在这里要做的是在复制一个节点时克隆整个数据结构.在那种情况下,我无法看到一种方法,你可以在复制构造函数中明智地做到这一点.我建议让类不可复制并编写一个单独的函数来克隆整个数据结构.如果你提供了关于如何构造Nodes 结构的更多背景,我可以提供更具体的建议.
编辑
您在评论中指出这是一棵树,这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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,不是分配新的Nodefor previous,而是将其留空并让其父级设置它.
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |