考虑以下代码:
struct A {};
struct B
{
B(A* a) : a(a) {}
private:
A* a;
};
struct base
{
base(B b) : b(b) {}
protected:
A a;
private:
B b;
};
struct derived : public base
{
derived() : base(B(&a)) // <-- IS THIS OK?
{}
};
这里,基类需要一个由派生类传递给它的构造函数的B对象,而B对象引用一个A对象,但是A对象存在于基类中。
B对象的构造函数除了存储它之外没有对A指针做任何事情,所以我认为这应该没问题,但它仍然感觉不对,因为技术上A对象在我没有存在的时候将它传递给基础构造函数。
我可以在这方面遇到麻烦,还是应该这样做?
答案 0 :(得分:4)
a
尚未构建,但它确实有一个地址,此时获取其地址是合法的。但是,您确实需要确保不在B
的构造函数中使用指针(即,不要取消引用指针)。
但这一切都很尴尬。
答案 1 :(得分:4)
只要您不在a
的构造函数中使用 B
,它就是安全的,因为对象a
尚未构建。
我的意思是,你不应该取消引用a
构造函数中的指针B's
;但是,在base
的构造函数执行后,您可以在B::a
的其他方法中安全地取消引用B
。