首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对对象的引用必须在构造函数基/成员初始化程序列表中初始化。

对对象的引用必须在构造函数基/成员初始化程序列表中初始化。
EN

Stack Overflow用户
提问于 2016-03-08 17:23:25
回答 3查看 838关注 0票数 0

原谅我,我的C++有点生疏了。

我正在尝试通过一个接口创建一个Singleton (这样,系统可以在以后的需要时轻松地进行扩展)。

我有以下界面:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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

代码语言:javascript
复制
#include "IBuildConfiguration.h"

class MyClass
{
    private:
        IBuildConfiguration& oFoo;

    public:
        MyClass();
};

MyClass.cpp

代码语言:javascript
复制
MyClass::MyClass()
{
    oFoo = BCInstance();
}

不幸的是,这会导致编译器错误'oFoo' : must be initialized in constructor base/member initializer list,而我不知道发生了什么。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-08 18:04:15

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-03-08 17:25:19

遵循错误信息指示:

代码语言:javascript
复制
MyClass::MyClass() : oFoo(BCInstance())
{
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-08 17:25:49

您不能修改引用所指的内容。您只能初始化它:

代码语言:javascript
复制
MyClass::MyClass() : oFoo(BCInstance())
{
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35873898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档