原谅我,我的C ++有点生疏。
我正在尝试通过接口创建一个Singleton(这样,系统可以根据需要在以后轻松扩展)。
我有以下界面:
@font-face {
font-family: 'A_Inc_Corsivo';
src: url('Corsivo_Incimar.ttf');
}
以下具体课程:
BuildConfiguration.h
#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 */
BuildConfigration.cpp
#ifndef BUILD_CONFIGURATION_H
#define BUILD_CONFIGURATION_H
class BuildConfiguration : public IBuildConfiguration
{
public:
BuildConfiguration();
~BuildConfiguration();
virtual int foo(void);
};
#endif /* BUILD_CONFIGURATION_H */
现在,我正在尝试按如下方式使用该对象:
MyClass.h
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.cpp
#include "IBuildConfiguration.h"
class MyClass
{
private:
IBuildConfiguration& oFoo;
public:
MyClass();
};
不幸的是,这导致编译器错误MyClass::MyClass()
{
oFoo = BCInstance();
}
,我无法弄清楚发生了什么。感谢
答案 0 :(得分:2)
要添加其他人已经指出的内容,当程序进入构造函数体时,类成员将已经创建(通过其默认构造函数)。因此,类主体中的任何初始化都将调用赋值构造函数,因为该对象已经被创建。
现在,由于无法重新初始化引用,因此在构造函数体内分配引用意味着重新初始化,因此编译器会标记一个错误,要求您在构造函数初始化列表中初始化引用。
初始化const
成员和没有默认构造函数的类成员时也是如此。
答案 1 :(得分:1)
按照错误信息指示:
MyClass::MyClass() : oFoo(BCInstance())
{
}
答案 2 :(得分:1)
您无法修改引用引用的内容。你只能初始化它:
MyClass::MyClass() : oFoo(BCInstance())
{
}