原谅我,我的C++有点生疏了。
我正在尝试通过一个接口创建一个Singleton (这样,系统可以在以后的需要时轻松地进行扩展)。
我有以下界面:
#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,而我不知道发生了什么。谢谢
发布于 2016-03-08 18:04:15
为了添加其他人已经指出的内容,当程序进入构造函数体时,类成员已经被创建(通过他们的默认构造函数)。因此,类主体中的任何初始化都将调用赋值构造函数,因为对象已经创建。
现在,由于不能重新初始化引用,因此在构造函数体中分配引用将意味着重新初始化,因此编译器标记一个错误,要求您在构造函数初始化列表中初始化引用。在初始化没有默认构造函数的const成员和类成员时也是如此。
发布于 2016-03-08 17:25:19
遵循错误信息指示:
MyClass::MyClass() : oFoo(BCInstance())
{
}发布于 2016-03-08 17:25:49
您不能修改引用所指的内容。您只能初始化它:
MyClass::MyClass() : oFoo(BCInstance())
{
}https://stackoverflow.com/questions/35873898
复制相似问题