我正在追逐圈子中的错误消息,试图弄清楚我是如何得到我需要工作的。
我正在制作一个象棋游戏,每个西洋棋棋子都是一个类,并且有一个名为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 * 调用抱怨它需要实现。
答案 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
公开派生。