C ++用于国际象棋的接口基类数组

时间:2014-01-15 19:26:37

标签: c++ oop inheritance interface

我正在追逐圈子中的错误消息,试图弄清楚我是如何得到我需要工作的。

我正在制作一个象棋游戏,每个西洋棋棋子都是一个类,并且有一个名为Piece的接口类。

Piece.h

class Piece {
public:
    virtual ~Piece() {};
    /*
     * Verifies the move on a per-piece basis. If the move is valid, make the changes on the board and return true, false otherwise.
     *
     * @param b             Reference to the board
     * @param toLocation    Where to move the piece
     * @return bool         If the move is valid
     */
    virtual bool move(Board &b, std::pair<int, int> toLocation) { return false; }

protected:
    Piece(GameData::Color _c) { c = _c; }
    GameData::Color c;
};

Pawn.h

class Pawn : Piece {
public:
    Pawn(GameData::Color _c);
    virtual ~Pawn();
    bool move(Board &b, std::pair<int, int> toLocation);
};

我无法使用此设置。

我收到错误:

Pawn::Pawn(GameData::Color _c) : c(_c) {
no matching function for call to Piece::Piece()

我将Piece的可见性更改为:

class Pawn : public Piece

但是我得到了更多的错误,我再没有一个空的构造函数。

我正在设置这个以尝试制作一个2D数组来代表棋盘:

board = new Piece**[SIZE];
for(int i = 0; i < SIZE; ++i)
    board[i] = new Piece*[SIZE];
/* Setup initial positions */
board[0][0] = new Rook(GameData::BLACK);

这就是为什么我不能将移动方法简单地视为虚拟...因为新的Piece * 调用抱怨它需要实现。

2 个答案:

答案 0 :(得分:5)

您必须通过initialization list

调用Piece构造函数
Pawn(GameData::Color _c): Piece(_c) {}

或创建默认构造函数并通过方法初始化值。你的选择。

答案 1 :(得分:5)

编译器抱怨,因为您的Pawn构造函数未指定应如何初始化其Piece基础子对象。通常不指定这将导致调用Piece的默认构造函数,但Piece没有默认构造函数,因此错误。

通过明确修复:

Pawn::Pawn(GameData::Color _c) : Piece(_c) {}

这告诉编译器你想通过调用接受Color的构造函数来初始化基类;该构造函数将负责分配c = _c所以(给出简化示例),您将留下Pawn::Pawn的空体。

顺便说一句,由于您打算不仅将Piece用作基类,而且还要将接口公开给外部世界,Pawn应该从Piece公开派生。