2014-01-23 49 views
0

假設我正在實現一個雙人棋的遊戲。爲簡單起見,這裏是我的實現的縮寫版本,省略了任何不相關的細節。我有一個類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對象正在使用垃圾進行初始化。

我的本意是爲kingBoard的構造函數初始化:

Board() { king = King(white); }

在這裏,我想從國王的構造,這需要color_t參數調用,這將進而調用構造函數從Piece像這樣:

King(color_t color) { Piece(K, 'K', color); }

這不是發生了什麼。正在調用默認的構造函數(KingPiece或兩者)。 king的默認構造函數在Board的私有字段中聲明時調用?如果是這種情況,我如何更改代碼以便king調用相應的構造函數?

+0

'Piece(K,'K',color);'創建一個臨時對象。你需要使用mem-initializer-list。 – dyp

回答

3

你有錯誤的語法(這是合法的,但不會做你的想法)。你需要調用在基類構造函數initializaton列表

King(color_t color) : Piece(K,'K',color) {} 

通過你進入一個構造器的身體的時候,所有的基類和數據成員已經被初始化。如果你沒有顯式初始化它們,它們會得到默認的初始化(這意味着在基類中調用默認構造函數)。

在你的代碼中,你實例化了一個本地匿名的Piece對象。

+0

「錯誤」=做了一件與預期不同的事 – dyp

+0

@dyp在OP意圖代碼的內容中出現錯誤:) – juanchopanza

+0

謝謝+1;它解決了我的問題。你能給我一個簡要的解釋,爲什麼它必須從初始化列表而不是構造函數體調用? –

相關問題