我敢肯定我在這裏丟失了一些相當簡單的東西,但是當我嘗試訪問存儲在超類中的枚舉時遇到了分段錯誤。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;
}
非常感謝。
你能告訴我們你在哪裏打電話嗎? – Gasim
顯示一些(最小的)重現問題或沒有發生的代碼。 – juanchopanza
道歉,已修改。虛擬化解構器似乎沒有改變任何東西。 –