必须在构造函数base / member初始化列表中初始化对象的引用

时间:2016-03-08 17:23:25

标签: c++ inheritance interface reference singleton

原谅我,我的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(); } ,我无法弄清楚发生了什么。感谢

3 个答案:

答案 0 :(得分:2)

要添加其他人已经指出的内容,当程序进入构造函数体时,类成员将已经创建(通过其默认构造函数)。因此,类主体中的任何初始化都将调用赋值构造函数,因为该对象已经被创建。

现在,由于无法重新初始化引用,因此在构造函数体内分配引用意味着重新初始化,因此编译器会标记一个错误,要求您在构造函数初始化列表中初始化引用。 初始化const成员和没有默认构造函数的类成员时也是如此。

答案 1 :(得分:1)

按照错误信息指示:

MyClass::MyClass() : oFoo(BCInstance())
{
}

答案 2 :(得分:1)

您无法修改引用引用的内容。你只能初始化它:

MyClass::MyClass() : oFoo(BCInstance())
{
}