我想这样做,但我的错误是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
为空。我只是错了吗?
答案 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完全定义的范围内,不仅要声明。