题
在C ++我不得不想要重新指向其所有者的对象的引用,但由于其没有做过构建我不能包含类的建设过程中设置的指针。所以,我试图做这样的事情:
class A {
public:
A() : b(this) {}
private:
B b;
};
class B {
public:
B(A* _a) : a(_a) {}
private:
A* a;
};
有一种方法,以确保总是乙得到无A保持一个指针到B与A *初始化?
由于
解决方案
尝试这种情况:
class A;
class B {
public:
B(A *_a) : a(_a) {};
private:
A* a;
};
class A {
public:
A() : b(this) {};
private:
B b;
};
由于B处于完全包含的,它必须首先声明。它需要一个指向A,所以你必须声明B之前转发-声明。
此代码下的克++更多或更少的电流版本编译。
其他提示
在C ++我不得不想要重新指向其所有者的对象的引用,但由于其没有做过构建我不能包含类的建设过程中设置的指针。
可以存储该指针不行了。
什么你不能做的是试图去通过在B的构造函数指针成员/ A的方法,因为父实例可能不能完全在点初始化:
#include <iostream>
class Y;
class X
{
Y* y;
public:
X(Y* y);
};
class Y
{
X x;
int n;
public:
Y(): x(this), n(42) {}
int get_n() const { return n; }
};
X::X(Y* p): y(p)
{
//Now this is illegal:
//as it is, the n member has not been initialized yet for parent
//and hence get_n will return garbage
std::cout << p->get_n() << '\n';
}
int main()
{
Y y;
}
如果你是Y中的成员围绕切换,因此n会先被初始化,X的构造函数将打印42,但就是太脆弱依赖。
不隶属于 StackOverflow