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

时间:2015-04-04 23:46:23

标签: c++ class variables reference initialization

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

在我的Game类中,我需要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);
}`

这段代码无法编译,我在这里迷失了。

来自编译器的错误消息:

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

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

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

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

错误:表达式列表在mem-initializer [-fpermissive]中被视为复合表达式 警告:逗号运算符的左操作数无效[-Wunused-value] |

错误:“Guesser&”类型引用的初始化无效来自'const char *'|

类型的表达式

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果要由构造函数初始化,则需要在guesser范围内声明

providerclass Game { }

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

此外,参考成员通常是课堂设计的红旗。您可能希望使用guesserprovider的常规成员对象而不是引用。

class Game {
    Guesser guesser;
    Provider provider;
};