假设我正在实施一个双人棋的游戏。为简单起见,这是我的实现的缩短版本,省略任何不相关的细节。我有一个类Piece
,从中可以得到各个部分。在这个例子中,我只包括King
件。
extern enum piece_t;
extern enum color_t;
class Piece
{
public:
Piece() {}
Piece(piece_t t, char r, color_t c)
: type(t), representation(r), color(white)
{}
char getRepresentation()
{ return representation; }
protected:
piece_t type;
color_t color;
char representation;
};
class King : public Piece
{
public:
King() {}
King(color_t color) { Piece(K,'K',color); }
};
在另一个类Board
中,我定义了一个实例King
class Board
{
public:
Board() { king = King(white); }
friend ostream& operator<<(ostream&, const Board&);
private:
King king;
};
以下是main的一个示例:
int main(void)
{
Board game;
std::cout << game;
return 0;
}
问题是正在调用默认构造函数。我知道这种情况正在发生,因为我的king
对象正在用垃圾进行初始化。
我的目的是在king
的构造函数中初始化Board
:
Board() { king = King(white); }
从这里开始我希望King的构造函数调用color_t
参数,从而调用Piece
中的构造函数,如下所示:
King(color_t color) { Piece(K, 'K', color); }
这不是正在发生的事情。正在调用默认构造函数(King
或Piece
或两者)。在king
的私有字段中声明Board
时是否调用了默认构造函数?如果是这种情况,我该如何更改代码以便king
调用相应的构造函数?
答案 0 :(得分:3)
你的语法错误(这是合法的,但不符合你的想法)。您需要在初始化列表中调用基类构造函数:
King(color_t color) : Piece(K,'K',color) {}
当您进入构造函数体时,所有基类和数据成员都已初始化。如果你没有显式初始化它们,它们会默认初始化(这意味着在基类的情况下调用默认构造函数)。
在您的代码中,您正在实例化一个本地的匿名Piece
对象。