c++ - 对对象的引用必须在构造函数基类/成员初始化列表中初始化

标签 c++ inheritance interface reference singleton

请原谅,我的 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/

相关文章:

c++ - gcc 相当于 VC++ 警告 C4018 : signed/unsigned mismatch

c++ - 使用派生类类型初始化模板类的静态数组

c# - 如何使用 Entity Framework 在保存的实体及其子属性上自动设置 CreatedOn 字段

interface - 流接口(interface)与对象类型别名

C++结构类型重定义错误

c++ - Boost几何cartesian2d.hpp

C# 日志设计 : Extension method, 的替代方案?

oop - 接口(interface)中的 void 方法是代码气味吗?

c++ - 如何找到转换光线的位置以避免在 Bullet 中发生碰撞?

javascript - 原型(prototype)继承和实例数组的问题