循环引用:Class没有构造函数和null成员shared_ptr值

时间:2015-05-25 17:43:39

标签: c++

我想这样做,但我的错误是Y class has no constructors

class Y;
class X
{
    std::shared_ptr<Y> base;
    //other  private stuff
public:
    X()
    {
        base = std::shared_ptr<Y>(new Y(this));
    }
    std::shared_ptr<Y> Get(){ return base; }
};
class Y
{
    X d;
    //other private stuff
public:
    Y(X * b) :d(*b){}
};

将其用作

X x; // all values in X is defined
std::shared_ptr<Y> spy=x.Get();

spy包含X中的所有私有值,除了它自己的shared_ptr,它是空的。这是正常的吗?

更多解释: spy包含d的{​​{1}}。如果我在调试器中X内查看d,我看到spy为空。我只是错了吗?

2 个答案:

答案 0 :(得分:1)

由于X::X()的定义取决于特定Y构造函数的存在,因此需要在后者之后。那就是:

class Y;

class X
{
    std::shared_ptr<Y> base;
    //other  private stuff
public:
    X(); // just the declaration here, we don't know that Y(X*) is 
         // a valid constructor yet. 
    std::shared_ptr<Y> Get(){ return base; }
};

class Y
{
    /* all of Y */
};

// NOW, this is valid
// because we know that Y::Y(X*) is a valid constructor
X::X() {
    base = std::shared_ptr<Y>(new Y(this));
}

答案 1 :(得分:1)

你的问题是new Y(this)应放在Y完全定义的范围内,不仅要声明。