在本设计课程中:
class X
{
X* left_;
X* right_;
X(const X&)
};
当我尝试实现cpy ctor时,我正在进入循环:
X::X(const X& pattern)
{
if (this != &pattern)
{
left_ = new X(*pattern.left_);//this is the line
}
}
作为解决方案,我正在考虑使用memcpy + operator new()fnc,但是有更好的方法吗?
答案 0 :(得分:4)
你有一个无限大的树,因为你的left_
和right_
指针看起来总是指向另一个X
?你还希望复制这么大的树而不是总是下降到另一个子树?
你想要一个停止条件,比如
X::X(const X& pattern)
:left_(0), right_(0)
{
if(pattern.left_)
left_ = new X(*pattern.left_);//this is the line
/* ... */
}
答案 1 :(得分:2)
如果我从你对约翰内斯答案的评论中正确理解你,你只想复制一代孩子吗?创建另一个构造函数,例如
class X
{
public:
X(const X& other)
:left_(0), right_(0)
{
left_ = new X(*other.left_, 1);
}
X(const X& other, unsigned howDeep)
:left_(0), right_(0)
{
if(howDeep == 0)
return;
left_ = new X(*other.left_, howDeep - 1);
}
private:
X* left_;
X* right_;
};