2011-11-21 41 views
1

我正在使用OpenGL(加上GLUT和GLUI)實現一個簡單的棋盤遊戲(突破)。多態 - 適當使用指向純抽象類的指針?

我在考慮實現一個Board類,它將有一個vector<vector<Cell> >作爲它的一個屬性。 Cell代表遊戲板中的空間。它可以包含一個GameObjectGameObject將是一個純粹的抽象類。例如,它要求其派生類實施render()。可能衍生物類將是:

  • Blank,表示一個空的空間
  • Pawn,代表的棋子(唯一可能的條突破)

該板將第一渲染板被渲染,然後遍歷每個Cell,獲取其內容,併爲其中的每一個調用render()

我能想到的實現這一點的唯一可行的方法是使GameObjectCell指針(board[y][x].getContents()->render(),其中getContents()返回GameObject*

這是做到這一點的最好方法是什麼?這是指針的適當用法嗎?

+0

一個'指向一個純抽象class'是從來沒有確定。這通常也是不可能的。然而,你可以有一個類型爲(abstract_class *)的指針,指向派生類的非抽象實例,是的。 – sehe

+0

@sehe - 你懂我的意思。 ':)' –

回答

3

讓我推動我的評論到答案。這並不意味着它在任何意義上都是完整的,只是這允許我拼出一些代碼示例。我原來的評論:

這是確定的,雖然你可能會用std::unique_ptr<GameObject>std::shared_ptr<GameObject>這樣你就不會迷路AMIDS人工生命週期管理問題做的更好。最後,一個平坦的一維數組如何進入大步?

以下是我可能會去這一點:

#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... 
} 
+0

'board [y] [x] .getContents()'是正確的,是的。讓我糾正一下。 –

+0

@FranciscoP .:很酷,我刪除了那句話,因爲它沒有更多的目的。 –

+0

關於平面1D陣列+步幅:電路板將通過基於Prolog的程序的套接字接口供給此C++應用程序。 Prolog程序使用'list'列表來表示內容,所以我想我會保持一致。這是唯一的原因,它不是一個特別強大的:P –

2

是的。

另外,也許你應該用你的細胞(或某種矩陣等等),另一個容器