C++ 复制构造函数

C++ 复制构造函数,c++,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+

在本设计的课堂上:

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+操作符new()fnc,但是有更好的方法吗

您有一个无限大的树,因为它看起来像您的
指针总是指向另一个
X
?复制这么大的一棵树,你还能指望什么呢

你想有一个停止条件,比如

    X::X(const X& pattern)
    :left_(0), right_(0)
    {
        if(pattern.left_)
            left_ = new X(*pattern.left_);//this is the line
        /* ... */
    }

您有一个无限大的树,因为它看起来像您的
指针总是指向另一个
X
?复制这么大的一棵树,你还能指望什么呢

你想有一个停止条件,比如

    X::X(const X& pattern)
    :left_(0), right_(0)
    {
        if(pattern.left_)
            left_ = new X(*pattern.left_);//this is the line
        /* ... */
    }

如果我从你对约翰尼斯答案的评论中正确地理解了你,你只想复制一代孩子?制作另一个构造函数,例如

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

如果我从你对约翰尼斯答案的评论中正确地理解了你,你只想复制一代孩子?制作另一个构造函数,例如

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

@约翰:是的,这是一个解决方案,但前提是你想复制所有内容。我(很抱歉没有提到这一点,有点匆忙)只需要复制“旁边的一个”,如果你知道我在做什么的话mean@Andre如果你把这个对象作为一个参数传递给一个ctor,它们不是相等的吗?约翰,你觉得什么没有意义?@Johan是的,这是一个解决方案,但前提是你想复制所有东西。我(很抱歉没有提到这一点,有点匆忙)只需要复制“旁边的一个”,如果你知道我在做什么的话mean@Andre如果你把这个对象作为一个参数传递给一个ctor,它们不是相等的吗?约翰,你有什么不明白的吗?对不起,这个怎么可能相等呢?哎呀,它们是两个不同的物体!为什么不呢?见代码:X;X:X(X)@Ajay:你不能像那样显式地调用构造函数。在复制构造函数中,参数不能是
this
,因为在形成参数时,正在构造的对象不存在。@Ajay:这应该是什么?这不是C++。迈克你说得对,这是不可能的。我犯了个错误。该结构应与赋值运算器一起使用;对不起,
这个
怎么能等于
模式
?哎呀,它们是两个不同的物体!为什么不呢?见代码:X;X:X(X)@Ajay:你不能像那样显式地调用构造函数。在复制构造函数中,参数不能是
this
,因为在形成参数时,正在构造的对象不存在。@Ajay:这应该是什么?这不是C++。迈克你说得对,这是不可能的。我犯了个错误。该结构应与赋值运算器一起使用;哇,带复制构造函数的递归!哇,带复制构造函数的递归!