0

私はチェスゲームを開発しています。そこで、Piece という抽象クラスを作成し、実際のピースはこのクラスを実装します。Pawn、Rook などの具象クラスがあります。

問題は、2 つの部分を比較するためにインターフェイスにequalメソッドが必要なことです。私はポリモルフィックな方法、つまりピースを任意のピースと比較できる方法が欲しかったので、それに問題があります。問題は、「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 語彙の) Interface ではなく Abstract クラスに変更することで問題を解決しました。これで、コードの冗長性が減り、より明確になりました。

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 に答える