复制构造函数

时间:2011-07-14 14:29:23

标签: c++

在本设计课程中:

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,但是有更好的方法吗?

2 个答案:

答案 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_;    
};