C ++:将引用成员初始化为在初始化列表中创建的对象

时间:2012-07-05 05:52:58

标签: c++ reference initialization initializer-list

请考虑以下代码:

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指针而不是引用作为解决方法,但我更喜欢使用引用。

3 个答案:

答案 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) {}
};