假設我正在實現一個雙人棋的遊戲。爲簡單起見,這裏是我的實現的縮寫版本,省略了任何不相關的細節。我有一個類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;
};
下面是主要的例子:
int main(void)
{
Board game;
std::cout << game;
return 0;
}
的問題是,默認構造是被稱爲。我知道這是因爲我的king
對象正在使用垃圾進行初始化。
我的本意是爲king
在Board
的構造函數初始化:
Board() { king = King(white); }
在這裏,我想從國王的構造,這需要color_t
參數調用,這將進而調用構造函數從Piece
像這樣:
King(color_t color) { Piece(K, 'K', color); }
這不是發生了什麼。正在調用默認的構造函數(King
或Piece
或兩者)。 king
的默認構造函數在Board
的私有字段中聲明時調用?如果是這種情況,我如何更改代碼以便king
調用相應的構造函數?
'Piece(K,'K',color);'創建一個臨時對象。你需要使用mem-initializer-list。 – dyp