0

我正在开发一个国际象棋游戏。所以,我创建了一个名为 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;
};
4

2 回答 2

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方法...

于 2013-05-24T18:21:39.153 回答
0

我解决了将 Piece 的定义更改为抽象类而不是接口(在 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;
};
于 2013-05-24T18:57:10.730 回答