5

考虑以下代码:

class Foo {
    Foo() {}
};

class Bar {
    Foo &Foo_ref;
    Bar() : Foo_ref() {}
};

按原样编译,我收到错误:

tmp.cc:在构造函数 Bar::Bar() 中:
tmp.cc:7:错误:Foo& Bar::Foo_ref 的值初始化,它具有引用类型

我已经尝试了所有我能想到的变化。我究竟做错了什么?如何将引用成员初始化为新实例?我现在使用 const 指针而不是引用作为解决方法,但我更喜欢使用引用。

4

3 回答 3

7

引用必须始终绑定到对象。您必须在构造函数中传递要引用的对象

Bar(Foo &foo) : Foo_ref(foo)
{
}

如果您不想(或不能)传递FooBar构造函数 - 您必须使用指针:

class Bar {
    Foo *Foo_ptr;
    Bar() : Foo_ptr(nullptr) {}
};

您可以将引用成员变量视为必须绑定在初始化列表中的指针

于 2012-07-05T05:53:51.663 回答
5

有什么问题

class Bar
{
    Foo myFoo;
    Bar() : myFoo() {}
};

如果你想要一个全新的 Foo 对象?

于 2012-07-05T06:00:08.790 回答
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) {}
};
于 2012-07-05T05:56:09.320 回答