2014-01-19 66 views
-1

我敢肯定我在這裏丟失了一些相當簡單的東西,但是當我嘗試訪問存儲在超類中的枚舉時遇到了分段錯誤。C++:段訪問抽象超類'enum

我正在構建一個非常簡單的國際象棋遊戲。我有一個名爲Piece的課程,其中不同的部分(典當,騎士等)繼承。在頭文件「ChessPieces.hpp」類的聲明看起來是這樣的:

enum Colour { BLACK, WHITE }; 

class Piece { //Parent superclass, never instantiated. 
    protected: 
     Colour colour; 
    public: 
     Piece(Colour colour); 
     ~Piece(); 
     virtual bool legalMove (pair<int, int> fromP, pair<int, int> toP) = 0; 
     virtual void print(); 
     Colour getColour(); 
}; 

而在「ChessPieces.cpp」文件看起來像這樣的相關方法:

Piece::Piece (Colour c) { 
    colour = c; 
} 

Piece::~Piece() { } 

void Piece::print() { 
    switch (colour) { 
     case BLACK: 
      cout << "Black"; break; 
     case WHITE: 
      cout << "White"; break; 
    } 
} 

Colour Piece::getColour() { 
    return colour; 
} 

這將編譯,鏈接等等。但是,如果在其中一個Piece子類的實例上調用getColour()方法,則會發生分段錯誤。爲什麼是這樣?

UPDATE:

這裏就是代碼被調用。碎片位於map<pair<int, int>, Piece>

//Check if square is on board. 
if (!isRealSquare(fromP) || !isRealSquare(fromP)) { 
    cout << "Sorry, one of your squares isn't on the board!\n"; 
    return; 
} 
//Check piece exists. 
if ((*pieces)[fromP] != NULL) { 
    cout << "There is no piece there.\n"; 
    return; 
} 
//Check player is moving one of their own pieces 
if ((*pieces)[fromP] -> getColour() != playerTurn) { 
    cout << "That's not one of your pieces.\n"; 
    return; 
} 

非常感謝。

+1

你能告訴我們你在哪裏打電話嗎? – Gasim

+2

顯示一些(最小的)重現問題或沒有發生的代碼。 – juanchopanza

+0

道歉,已修改。虛擬化解構器似乎沒有改變任何東西。 –

回答

1

如果你在你的支票仔細看,你會發現,你只能達到這樣的:

if ((*pieces)[fromP] -> getColour() != playerTurn) 

(*pieces)[fromP]NULL。所以,你正在引用一個NULL指針。

+0

我是個白癡。謝謝。 –