我确定我在这里遗漏了一些相当简单的内容,但是当我尝试访问存储在超类中的枚举时,我遇到了分段错误。
我正在构建一个非常简单的国际象棋游戏。我有一个名为Piece的类,不同的部分(pawn,knight等)继承。头文件中的类声明" 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 ();
};
虽然&#34; ChessPieces.cpp&#34;中的相关方法文件看起来像这样:
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()方法时,会发生分段错误。这是为什么?
更新:
这里是调用代码的地方。片段位于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;
}
非常感谢。
答案 0 :(得分:1)
如果仔细查看支票,您会看到只能达到此目的:
if ((*pieces)[fromP] -> getColour() != playerTurn)
当(*pieces)[fromP]
为NULL
时。因此,您要取消引用NULL指针。