繁体   English   中英

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

[英]C++: Initializing a reference member to an object created in the initialization 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指针而不是引用作为解决方法,但我更喜欢使用引用。

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

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

如果你不想(或不能)将Foo传递给Bar构造函数 - 你必须使用指针:

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

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

怎么了?

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

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

构造函数必须获取参数,将引用设置为在引用之前初始化的成员,或者将引用设置为全局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) {}
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM