多态性 - 适当使用指向纯抽象类的指针?

时间:2011-11-21 15:15:03

标签: c++ pointers polymorphism abstract-class

我正在使用OpenGL(加上GLUT和GLUI)实现一个简单的棋盘游戏(突破)。

我正在考虑实现一个Board类,它将vector<vector<Cell> >作为其属性之一。 Cell代表游戏板中的空间。它可以包含GameObjectGameObject将是一个纯粹的抽象类。例如,它要求其衍生类实现render()。可能的派生类将是:

  • Blank,代表一个空白区域
  • Pawn,代表一个棋子(突破中唯一可能的部分)

首先渲染棋盘,然后迭代每个Cell,获取其内容并为每个棋子调用render()来渲染棋盘。

我能想到实现这一目标的唯一可能方法是让GameObject Cell指针board[y][x].getContents()->render(),其中getContents()返回GameObject*

这是最好的方法吗?这是指针的适当用法吗?

2 个答案:

答案 0 :(得分:3)

让我将评论推广到答案中。这并不意味着它在任何意义上都是完整的,只是这允许我拼出一些代码示例。我原来的评论:

  

没关系,虽然您可能会使用std::unique_ptr<GameObject>std::shared_ptr<GameObject>做得更好,这样您就不会因手动生命周期管理问题而迷失方向。最后,一个平坦的1-D阵列如何大步进入?

以下是我如何解决这个问题:

#include <vector>
#include <memory>

struct GameObject { virtual void render() const = 0; virtual ~GameObject() { } };

class Cell
{
  std::unique_ptr<GameObject> m_go;

public:
  void render() const { m_go->render(); }
  Cell() : m_go(new BlankCell) { }
  // more functions to reassign the cell value etc.
};

class Board
{
  std::vector<Cell> m_board;
  std::size_t       m_length;

public:
  Board(std::size_t length) : m_board(length * length), m_length(length) { }
  Cell & cell(std::size_t i, std::size_t j) { return m_board(j + i * m_length); }
  Cell const & cell(std::size_t i, std::size_t j) const { return const_cast<Board*>(this)->cell(i, j); }
  // more...
}

答案 1 :(得分:2)

另外,也许你应该为你的细胞使用另一个容器(某种矩阵左右)