2011-11-21 2 views
1

OpenGL (GLUT 및 GLUI 포함)을 사용하여 간단한 보드 게임 (Breakthrough)을 구현하고 있습니다.다형성 - 순수 추상 클래스에 대한 포인터의 적절한 사용?

Board 클래스를 구현하려고합니다.이 클래스의 속성 중 하나는 vector<vector<Cell> >입니다. Cell은 게임 보드의 공간을 나타냅니다. GameObject을 포함 할 수 있습니다. GameObject은 순수 추상 클래스입니다. 예를 들어 파생 클래스가 render()을 구현하도록 요구합니다. 가능한 유도체 클래스가 될 것이다 폰 (침투에 유일하게 가능한 부분)를 나타내는 빈 공간

  • Pawn 나타내는

    • Blank,

    보드는 제 보드를 렌더링함으로써 렌더링되는 각 Cell을 반복하면서 해당 내용을 가져와 각각에 대해 render()을 호출합니다. 내가 이것을 달성하기 위해 생각할 수있는

    유일한 가능한 방법이이 작업을 수행하는 가장 좋은 방법입니다

    (getContents()GameObject*을 반환 board[y][x].getContents()->render() 등) Cell에서 GameObject 포인터를하고있다? 이것은 포인터의 적절한 사용법입니까?

  • +0

    순수한 추상적 class'에 대한'포인터가 결코 괜찮습니다. 또한 일반적으로 불가능합니다. 그러나 유형 (abstract_class *)의 포인터는 파생 된 것의 비 추상적 인 인스턴스를 가리킬 수 있습니다. – sehe

    +0

    @sehe - 당신이 의미하는 바를 얻었습니다. ':)' –

    답변

    3

    당신의 세포에 대한 다른 컨테이너 (행렬 어떤 종류의 정도)를 사용합니다. 그렇다고해서 어떤 의미에서든 완벽하다는 의미는 아니며, 일부 코드 예제를 설명 할 수 있습니다. 내 원래의 코멘트 : 당신은 아마 std::unique_ptr<GameObject> 또는 그래서 당신은 수동 수명 관리 문제 amids 손실되지 않는 std::shared_ptr<GameObject> 더 잘 할 것이지만, 괜찮아요

    . 마지막으로 스트라이드에서 액세스 할 수있는 평면 1 차원 배열은 어떨까요? 여기

    내가 이것에 대해 갈 수있는 방법은 다음과 같습니다

    #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'의'list'를 사용합니다. 그래서 나는 그것을 일관되게 유지할 것이라고 생각했습니다. 그것이 유일한 이유이며, 특별히 강력한 것은 아닙니다 : P –

    2

    예.

    또한, 어쩌면 당신은 내게 대답에 내 댓글을 촉진하자

    관련 문제