2013-05-24 2 views
0

Я развиваю шахматную игру. Итак, я создал абстрактный класс под названием Piece, а реальные части реализуют этот класс, поэтому у меня есть конкретные классы, такие как Pawn, Rook ...C++ равный метод в абстрактном классе

Проблема: мне нужен равный метод в интерфейсе для сравнения двух куски. У меня проблемы с этим, потому что мне нужен полиморфный метод, то есть метод, который мог бы сравнить кусок с любой частью. Проблема в том, что я не могу объявить «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

Двойная отправка - ваш друг. - http://en.wikipedia.org/wiki/Double_dispatch (или RTTI, если вы просто сравниваете типы) –

+2

Что вам нужно сравнить о них? – Collin

+0

Вместо того, чтобы принимать параметр по значению (заставляя бесполезную копию и проблематичный срез объекта (если 'Piece' не были абстрактными), возьмите его _reference-to-const_:" 'const Piece & o'". (Не уверен, как вы будете реализовывать «равный», хотя ...) –

ответ

0

я решил мою проблему, изменяющее defition штучного до абстрактного класса вместо интерфейса (в 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; 
}; 
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 ...

Смежные вопросы