请考虑以下代码:
class Foo {
Foo() {}
};
class Bar {
Foo &Foo_ref;
Bar() : Foo_ref() {}
};
按原样编写,我收到错误:
tmp.cc: In constructor Bar::Bar(): tmp.cc:7: error: value-initialization of Foo& Bar::Foo_ref, which has reference type
我尝试过我能想到的每一个变化。我究竟做错了什么?如何将引用成员初始化为新实例? 我现在使用const指针而不是引用作为解决方法,但我更喜欢使用引用。
答案 0 :(得分:5)
必须始终将引用绑定到对象。您必须在构造函数
中传递要引用的对象Bar(Foo &foo) : Foo_ref(foo)
{
}
如果您不希望(或不能)将Foo
传递给Bar
构造函数 - 您必须使用指针:
class Bar {
Foo *Foo_ptr;
Bar() : Foo_ptr(nullptr) {}
};
您可以将引用成员变量视为必须在初始化列表
中绑定的指针答案 1 :(得分:3)
有什么问题
class Bar
{
Foo myFoo;
Bar() : myFoo() {}
};
如果你想要一个全新的Foo对象?
答案 2 :(得分:1)
构造函数必须接受参数,将引用设置为在引用之前初始化的成员,或者将引用设置为全局Foo
对象。您不能将引用绑定到临时(即使引用为const
,也只能在构造函数结束之前生效。
extern Foo gFoo;
class Bar {
Foo foo;
Foo &Foo_ref;
Bar() : Foo_ref(gFoo) {}
//or
//Bar() : Foo_ref(foo) {}
Bar(Foo& foo) : Foo_ref(foo) {}
};