在初始化列表中初始化引用变量

Initializing reference variables in initialization list

我有三个.cpp 文件:Game、Guesser 和Provider。这些文件的每个头文件都包含其各自的 class 声明。

在我的游戏 class 中,我需要 Guesser 和 Provider 的私有变量。

Guesser 有一个非默认构造函数

Guesser::Guesser (int wordLength, const char* wordListFilename){}

所以我必须通过 Game 构造函数上的初始化列表对其进行初始化。

我目前拥有的:

Guesser& guesser;

Provider& provider;

`Game::Game(int& wordLength, const char* filename, const Provider& providr) : guesser(wordLength, filename),provider(providr)
{
    numMissedGuesses = 0;
    wordSoFar = string(wordLength, FILL_CHARACTER);
}`

这段代码无法编译,我不知道从哪里开始。

来自编译器的错误消息:

||=== 构建:在 adthangman 中调试(编译器:GNU GCC 编译器)===|

错误:'guesser' 声明为引用但未初始化|

错误:'provider' 声明为引用但未初始化|

在构造函数中'Game::Game(int, const char*, const Provider&)':|

错误:表达式列表在内存初始化程序中被视为复合表达式 [-fpermissive]| 警告:逗号运算符的左操作数无效 [-Wunused-value]|

错误:从类型 'const char*'|

的表达式对类型 'Guesser&' 的引用的初始化无效

错误:从类型 'const Provider' 的表达式对类型 'Provider&' 的引用的初始化无效| ||=== 构建失败:5 个错误,1 个警告(0 分钟,0 秒)===|

非常感谢任何帮助。

您不能在作为引用的对象上使用构造函数。它本身不是对象,而是指向另一个对象。因此,要么将引用猜测器变量传递给 class 类型猜测器的另一个对象,要么将其更改为常规变量。此外,您不能将 const 对象分配给非常量引用。使提供者参数成为非常量。

guesserprovider 如果要由构造函数初始化,则需要在 class Game { } 范围内声明。

不过,您不能通过向其 class 的构造函数提供参数来初始化对 class 对象的引用。引用必须由预先存在的对象初始化。 (非成员引用也可以通过临时对象来初始化,但是有点不同。)

此外,参考成员通常是 class 设计的危险信号。您可能希望对 guesserprovider 使用常规成员对象而不是引用。

class Game {
    Guesser guesser;
    Provider provider;
};