2010-03-05 57 views
0

我有拥有私人属性,它是另一个类引用的类:我怎么能在我的课初始化引用属性

class A { 
public: 
    A(); 
    A(B& anotherB); 
private: 
    B& bRef; 
} 

在我的A(B & anotherB),我可以做到这一点:

A::A(B& anotherB) 
    : bRef(anotherB) { 
} 

但是A()呢?我尝试这样做:

A::A() 
    : bRef(B()) {} 

但我得到这个错误“的错误:类型的非const引用无效初始化‘’从临时类型的‘B B &’。

如何使用B的默认构造函数调用A中的初始化B引用?

谢谢。

回答

2

你必须有一个真实的实例来初始化它。说: bRef(B())创建一个临时销毁,因此您的参考将是一个不再存在的对象,因此编译器错误。

你不需要需要来初始化它,除非你根据它没有被初始化做出一些决定。在这种情况下,您可以使用一个bool initialized;成员来跟踪状态。

如果您想将其初始化为NULL之类的东西,请改用指针。

0

如果您知道该字段始终保存有效的引用,则应该使用引用字段为您的类建模。在你的情况下,你有你想要引用的默认构造函数指向一个虚拟值,它应该更适合用指针字段进行建模。您不能将NULL分配给引用,也不应指向堆栈上的对象创建,并且只在范围内有效。

+0

你指的是“你不能分配空引用”对吧? – YeenFei 2010-03-05 03:28:00

+0

是啊对不起,一个错字,现在会修复它 – 2010-03-05 03:50:42

0

参考文献总是指的是有效的对象。因此,如果没有有效的B对象,则无法初始化bRef。

建议:考虑将A :: A()私有化并且不实现它。

+0

A :: A()被遗留代码使用,我无法修改它。 – michael 2010-03-05 03:37:52

+0

我看到..然后我很好奇你为什么需要在其初始化列表中添加bRef。 – Arun 2010-03-05 03:58:45

1

如果你确实真的想要使用引用,但仍然保留默认构造函数,那么可以设置一个代表null或默认状态的全局(或静态文件)B实例,无论您希望将默认A使用。

A::A() 
: bRef(nullB) {} 
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的实例。

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