如何在类中初始化引用属性

时间:2010-03-05 03:18:48

标签: c++

我有一个类,它有一个私有属性,它是对另一个类的引用:

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引用?

谢谢。

5 个答案:

答案 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的有效实例。

请注意,这种结构是危险的旧式风格。