gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:52:49 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com