c ++静态成员函数

时间:2018-05-17 10:34:45

标签: c++ inheritance static static-members

我的任务有问题。

任务是关于国际英语国际象棋

实现静态成员函数需要执行以下任务之一,该函数返回匹配 PieceChar 位置的国际象棋对象的合适部分。

我建议它应该使用类似于克隆功能但不使用克隆成员函数本身的成员函数来实现Factory成员函数。工厂应该同样有效 尽可能地,因此代码是有效的(例如,就多分支而言)

这是PieceChar Given

enum class PieceChar : char
{
    WHITE_PAWN = 'P',
    WHITE_KNIGHT = 'N',
    WHITE_BISHOP = 'B',
    WHITE_ROOK = 'R',
    WHITE_QUEEN = 'Q',
    WHITE_KING = 'K',

    BLACK_PAWN = 'p',
    BLACK_KNIGHT = 'n',
    BLACK_BISHOP = 'b',
    BLACK_ROOK = 'r',
    BLACK_QUEEN = 'q',
    BLACK_KING = 'k',
    EMPTY = 'e',
};

这是继承的一些棋子基础的骨架

 class Piece
{
public:
  Piece(Colour c, const Position& pos);
  virtual void GenMoves(const Board &, std::vector<Move>& ) const = 0;
  Colour colour() const;
  void position(const Position& pos);
  const Position& position() const;
  virtual Piece* Clone() const = 0;
  static Piece* Factory(PieceChar, const Position& pos);
  virtual ~Piece();
private:
  Colour piece_colour;
  Position piece_pos;
};

class Pawn: public Piece
{
public:
  Pawn(Colour c, const Position& pos);
  ~Pawn();
  void GenMoves(const Board &, std::vector<Move>& ) const override;
  Piece* Clone() const override;
};

我无法实现以下功能

 static Piece* Factory(PieceChar, const Position& pos);

解决这个问题的任何提示或指南,我不知道在哪里可以问这边的问题。

如果您需要更多信息,请随时提出。

插件:我无法修改给定的声明,但我只能添加更多帮助函数。

1 个答案:

答案 0 :(得分:0)

简单的开关完成工作:

static std::unique_ptr<Piece> Piece::Factory(PieceChar type, const Position& pos)
{
    switch (type) {
        case PieceChar::WHITE_PAWN: return std::make_unique<Pawn>(Colour::White, pos);
        case PieceChar::WHITE_KNIGHT: return std::make_unique<Knight>(Colour::White, pos);
        case PieceChar::WHITE_BISHOP: return std::make_unique<Bishop>(Colour::White, pos);
        case PieceChar::WHITE_ROOK: return std::make_unique<Rook>(Colour::White, pos);
        case PieceChar::WHITE_QUEEN: return std::make_unique<Queen>(Colour::White, pos);
        case PieceChar::WHITE_KING: return std::make_unique<King>(Colour::White, pos);

        case PieceChar::BLACK_PAWN: return std::make_unique<Pawn>(Colour::Black, pos);
        case PieceChar::BLACK_KNIGHT: return std::make_unique<Knight>(Colour::Black, pos);
        case PieceChar::BLACK_BISHOP: return std::make_unique<Bishop>(Colour::Black, pos);
        case PieceChar::BLACK_ROOK: return std::make_unique<Rook>(Colour::Black, pos);
        case PieceChar::BLACK_QUEEN: return std::make_unique<Queen>(Colour::Black, pos);
        case PieceChar::BLACK_KING: return std::make_unique<King>(Colour::Black, pos);
        case PieceChar::EMPTY: throw std::runtime_error("invalid type");
    }
    throw std::runtime_error("unknown type");
}