2013-11-22 25 views
0

我一直在四處尋找解決這個問題的方法,而且我得到的最接近的是這個問題How do you initialize a map which takes a struct as value?,但它似乎沒有工作。 如果有人知道解決方案,那麼我很想知道,否則我會解決我的問題。我想創建一批棋子,爲此我創建了一個類「棋盤」和一個類「棋子」,這是所有棋子和騎士等繼承的超類。這是「ChessBoard.h」)試圖初始化映射,將一個對象作爲構造函數中的值

class ChessBoard { 
protected: 
    map< vector<int>, Piece* > chess_pieces; 
public: 
    ChessBoard(); 
}; 

現在我也有「海賊王」,這是「典當」的子類。我想分配一個Pawn類型的元素作爲chess_pieces之一。因此,棋盤構造函數中我有臺詞:

ChessBoard::ChessBoard() 
{ 
    /* Initialise white pieces */ 
    /* First we set up the pawns: */ 
    for (int j = 0; j < 8; j++) { 
     vector<int> v = {1, j}; 
     chess_pieces[v] = new Pawn; 
    } 
} 

然而,編譯器給我一個警告,叫我在「新典當」的分配,說我是「分配抽象類類型的對象典當'。這是不允許的?我用默認的構造函數定義了Pawn類,而Piece類也有默認的構造函數。此外,我已確保在Pawn類聲明中包含行

class Pawn: public Piece { 

。 如果有人知道如何做到這一點,我很想知道,謝謝你們的任何幫助可以給我!

+0

Pawn是否提供了在Piece中聲明的所有純虛方法的實現? –

+0

就是這樣!我忘了實施虛擬方法,感謝您的幫助! – user3023621

回答

1

你的班級必須在其中定義一個純粹的虛擬方法。類似virtual int foo() = 0;,您需要實現我們類Pawn中的類Piece的所有純虛方法,以便使'新Pawn'工作。

在您的問題中提供儘可能多的細節總是最好的,否則其他人將不得不猜測您的真實問題。

下面是一個簡單的例子程序來說明這個問題和編譯器的輸出:

class Piece 
{ 
public: 
    Piece() {} 
    virtual ~Piece() {} 

    virtual int foo() = 0; 
}; 

class Pawn: public Piece 
{ 
}; 

int main(int argc, char *argv) 
{ 
    Pawn *p = new Pawn; 
    delete p; 
    return 0; 
} 

:!g++ virtual.cpp 
virtual.cpp: In function ‘int main(int, char*)’: 
virtual.cpp:16: error: cannot allocate an object of abstract type ‘Pawn’ 
virtual.cpp:11: note: because the following virtual functions are pure within ‘Pawn’: 
virtual.cpp:7: note: virtual int Piece::foo() 
+0

ahhhh yes!我確實有一種純粹的虛擬方法,我不知道這是一個問題。謝謝你的幫助,我已經把頭撞在牆上好久了。我會盡量確保下次再添加更多細節。 (對不起,我不能投票,我的代表太低!) – user3023621

+0

不用擔心,你的代表如何做? –

+0

足夠投票了! – user3023621

0

該錯誤消息指出您沒有從Piece重寫所有抽象成員函數。確保你確實重寫了抽象函數的簽名,而不是類似的:成員的參數類型和常量沒有區別。

也就是說,你可能不應該使用std::map<...>來代表你的主板!使用二維數組(或對行和列具有適當訪問函數的一維數組)可能是更好的選擇。如果您堅持使用std::map<...>,請考慮使用std::pair<int, int>std::array<int, 2>作爲關鍵字。

+0

感謝您的快速回復!我沒有注意到,這是我的虛擬問題,這是它的關鍵。我的矢量方法有點不穩定,你的建議看起來更強大。謝謝! – user3023621

相關問題