在初始化列表中初始化引用变量
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 对象分配给非常量引用。使提供者参数成为非常量。
guesser
和 provider
如果要由构造函数初始化,则需要在 class Game { }
范围内声明。
不过,您不能通过向其 class 的构造函数提供参数来初始化对 class 对象的引用。引用必须由预先存在的对象初始化。 (非成员引用也可以通过临时对象来初始化,但是有点不同。)
此外,参考成员通常是 class 设计的危险信号。您可能希望对 guesser
和 provider
使用常规成员对象而不是引用。
class Game {
Guesser guesser;
Provider provider;
};
我有三个.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 对象分配给非常量引用。使提供者参数成为非常量。
guesser
和 provider
如果要由构造函数初始化,则需要在 class Game { }
范围内声明。
不过,您不能通过向其 class 的构造函数提供参数来初始化对 class 对象的引用。引用必须由预先存在的对象初始化。 (非成员引用也可以通过临时对象来初始化,但是有点不同。)
此外,参考成员通常是 class 设计的危险信号。您可能希望对 guesser
和 provider
使用常规成员对象而不是引用。
class Game {
Guesser guesser;
Provider provider;
};