对对象的引用必须在构造函数基/成员初始值设定项列表中初始化

Reference to object must be initialized in constructor base/member initializer list

本文关键字:初始化 列表 成员 引用 对象 构造函数      更新时间:2023-10-16

原谅我,我对我的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())
{
}