C ++:Segfault访问抽象超类'枚举

时间:2014-01-19 23:42:36

标签: c++ inheritance enums

我确定我在这里遗漏了一些相当简单的内容,但是当我尝试访问存储在超类中的枚举时,我遇到了分段错误。

我正在构建一个非常简单的国际象棋游戏。我有一个名为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;
}

非常感谢。

1 个答案:

答案 0 :(得分:1)

如果仔细查看支票,您会看到只能达到此目的:

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

。因此,您要取消引用NULL指针。