我正在尝试为我的二进制搜索编写一个复制构造函数,但由于某种原因它会出现分段错误。这是我的实现:
template <typename T>
BTree<T>::BTree(const BTree<T>& other)
{
copy_helper(this->root, other.root);
}
template <typename T>
void BTree<T>::copy_helper(Node<T>* copy_to, const Node<T>* copy_from) const
{
if(copy_from == NULL){
copy_to = NULL;
} else{
copy_to = new Node<T>;
copy_to->value = copy_from->value;
copy_helper(copy_to->left, copy_from->left);
copy_helper(copy_to->right, copy_from->right);
copy_helper(copy_to->parent, copy_from->parent);
}
}
答案 0 :(得分:1)
问题是指针cooy_to
是方法copy_helper.
的局部变量。结果更改变量copy_to
不会更改原始指针this->root
。
您应该通过引用或间接通过指针传递参数。 例如
void BTree<T>::copy_helper(Node<T>* ©_to, const Node<T>* copy_from) const
{
if(copy_from == NULL){
copy_to = NULL;
} else{
copy_to = new Node<T>;
copy_to->value = copy_from->value;
copy_helper(copy_to->left, copy_from->left);
copy_helper(copy_to->right, copy_from->right);
copy_helper(copy_to->parent, copy_from->parent);
}
}
实际上,数据方法应该声明为静态函数或具有一个参数const Node<T>* copy_from
的成员函数。
答案 1 :(得分:1)
如果名为parent
的成员名称如此,copy_helper(copy_to->parent, copy_from->parent)
将会做出可怕的事情。特别是,它会调用copy_helper
来复制父母的两个孩子,这些副本将分别复制他们的父母(再次),并且该副本将复制这两个孩子(再次),无限制地或直到它崩溃
仅复制向下树。不要再回去了。