对对象的引用必须在构造函数基/成员初始值设定项列表中初始化
Reference to object must be initialized in constructor base/member initializer list
原谅我,我对我的C++有点生疏。
我正在尝试通过接口创建一个单例(这样,系统以后可以根据需要轻松扩展)。
我有以下界面:
#ifndef IBUILD_CONFIGURATION_H
#define IBUILD_CONFIGURATION_H
*IBuildConfiguration.h*
class IBuildConfiguration
{
public:
virtual int foo(void) = 0;
};
IBuildConfiguration& BCInstance(void);
#endif /* IBUILD_CONFIGURATION_H */
以及以下具体类:
BuildConfiguration.h
#ifndef BUILD_CONFIGURATION_H
#define BUILD_CONFIGURATION_H
class BuildConfiguration : public IBuildConfiguration
{
public:
BuildConfiguration();
~BuildConfiguration();
virtual int foo(void);
};
#endif /* BUILD_CONFIGURATION_H */
构建配置.cpp
BuildConfiguration::BuildConfiguration()
{
// init stuff
}
BuildConfiguration::~BuildConfiguration()
{
// destroy stuff
}
int BuildConfiguration::foo(void)
{
return 382000; //just for fun
}
// Singleton initialization function
IBuildConfiguration& BCInstance(void)
{
static BuildConfiguration instance = BuildConfiguration();
return instance;
}
现在,我尝试按如下方式使用该对象:
MyClass.h
#include "IBuildConfiguration.h"
class MyClass
{
private:
IBuildConfiguration& oFoo;
public:
MyClass();
};
我的班级.cpp
MyClass::MyClass()
{
oFoo = BCInstance();
}
不幸的是,这会导致编译器错误'oFoo' : must be initialized in constructor base/member initializer list
,我无法弄清楚发生了什么。谢谢
为了补充其他人已经指示的内容,当程序进入构造函数主体时,类成员已经创建(通过其默认构造函数)。因此,类主体中的任何初始化都将调用赋值构造函数,因为对象已经创建。
现在,由于引用无法重新初始化,因此在构造函数主体中分配引用将意味着重新初始化,因此编译器会标记错误,要求您在构造函数初始化列表中初始化引用。初始化没有默认构造函数的类const
成员和成员时也是如此。
遵循错误消息指示:
MyClass::MyClass() : oFoo(BCInstance())
{
}
不能修改引用引用的内容。您只能初始化它:
MyClass::MyClass() : oFoo(BCInstance())
{
}
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?