请原谅,我的 C++ 有点生疏了。
我正在尝试通过接口(interface)创建一个单例(这样,以后可以根据需要轻松扩展系统)。
我有以下界面:
#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 */
BuildConfigration.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();
};
MyClass.cpp
MyClass::MyClass()
{
oFoo = BCInstance();
}
不幸的是,这会导致编译器错误 'oFoo' : must be initialized in constructor base/member initializer list
并且我不知道发生了什么。谢谢
最佳答案
为了补充其他人已经指出的内容,当程序进入构造函数主体时,类成员将已经创建(通过它们的默认构造函数)。因此,类体内的任何初始化都将调用赋值构造函数,因为对象已经创建。
现在,由于无法重新初始化引用,在构造函数体内分配引用将意味着重新初始化,因此编译器会标记一个错误,要求您在构造函数初始化列表中初始化引用。
初始化 const
成员和没有默认构造函数的类的成员也是如此。
关于c++ - 对对象的引用必须在构造函数基类/成员初始化列表中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873898/