我正在开发一款国际象棋游戏。所以,我创建了一个名为Piece的抽象类,真正的部分实现了这个类,所以我有像Pawn,Rook这样的具体类......
问题是:我需要在界面中使用相等的方法来比较两个部分。我遇到了问题,因为我想要一种polimorfic方法,也就是说,一种可以比较任何一块的方法。问题是我不能声明“Piece o”作为方法的参数因为Piece是一个抽象类型。我怎么能用C ++做到这一点?
我有以下代码:
class Piece
{
public:
virtual ~Piece();
virtual std::string name() = 0;
virtual Color color() const = 0;
virtual Type type() const = 0;
virtual Position position() const = 0;
virtual void moveToPosition(Position p) = 0;
virtual bool isValidMove(Position np, Board &b) = 0;
virtual vector<Movimento>& generateMoves(Board &t) = 0;
virtual bool equal(Piece &o) = 0;
};
答案 0 :(得分:0)
可能会做类似
的事情virtual bool operator==(const Piece&) = 0;
没有对象切片,你可以比较类型和其他信息..
或者您可以在Piece类中实现它,例如
virtual bool operator==(const Piece& rhs) {
if (this.type() == rhs.type()) {
return true;
}
else {
return false;
}
}
实际上,您可能不需要operator==
重载,而只需要equal
方法......
答案 1 :(得分:0)
我解决了将Piece的定义更改为Abstract类而不是Interface(在Java词汇表中)的问题。现在我的代码不那么冗余和清晰了。
class Piece
{
protected:
std::string m_Name;
Color m_Color;
PieceType m_PieceType;
Position m_Position;
public:
Piece(std::string n, Color c, PieceType t, Position p) :
m_Name(n), m_Color(c), m_PieceType(t), m_Position(p){};
virtual ~Piece();
std::string name() const;
Color color() const;
PieceType pieceType() const;
Position position() const;
bool equal(const Piece&) const;
virtual void moveToPosition(Position p) = 0;
virtual bool isValidMove(Position np, Board &t) = 0;
virtual vector<Move>& generateMoves(Board *b) = 0;
};