我有一个类,它有一个私有属性,它是对另一个类的引用:
class A {
public:
A();
A(B& anotherB);
private:
B& bRef;
}
在我的A(B& anotherB)中,我可以这样做:
A::A(B& anotherB)
: bRef(anotherB) {
}
但A()怎么样?我试过这个:
A::A()
: bRef(B()) {}
但是我得到了这个错误'错误:'B&'类型的非const引用的无效初始化来自'B'类型的临时错误。
如何使用B的默认构造函数调用A中的初始化B引用?
谢谢。
答案 0 :(得分:3)
你必须有一个真实的实例来初始化它。假设: bRef(B())
创建一个立即销毁的临时文件,因此您的引用将是一个不再存在的对象,因此编译器错误。
您不需要 来初始化它,除非您根据它未进行初始化做出某些决定。在这种情况下,您可以拥有一个bool initialized;
成员,用于跟踪状态。
如果要将其初始化为NULL
,请改用指针。
答案 1 :(得分:1)
如果您确实想要使用引用但仍保留默认构造函数,则可以设置B的全局(或文件静态)实例,表示null或默认状态,无论您希望默认A使用什么
A::A()
: bRef(nullB) {}
答案 2 :(得分:0)
如果您知道该字段始终包含有效引用,则应使用引用字段为类建模。在您的情况下,您有默认构造函数,您希望引用指向虚拟值,使用指针字段对其进行建模应该更合适。您不能将NULL分配给引用,也不应指向在堆栈上创建的对象,并且仅在范围内有效。
答案 3 :(得分:0)
引用始终引用有效对象。因此,如果没有有效的B对象,就无法初始化bRef。
建议:考虑将A :: A()设为私有而不实现它。
答案 4 :(得分:0)
使用c ++ - 11,你可以构建类似的东西:
class A {
public:
A();
A(B& anotherB);
private:
B& bRef = *(B*)(0);
// Or assign bRef with an accessible ( static ) instance of `B` previously created elsewhere
}
- 但是:bRef
被分配了一个NULL指针,一旦创建B
的实例,您就有责任分配A
的有效实例。
请注意,这种结构是危险的旧式风格。