2012-09-26 5 views
2

저는 현재 C++를 사용하여 RPG 게임을 개발 중입니다.지도에서 이벤트를 포함 할 시점에 이르렀습니다.같은 부모의 다른 아이들의 요소에 접근하는 어린이

지도에서 이벤트를 플레이어가 치료할 수 있기를 원했습니다. 이 작업을 수행하는 가장 쉬운 방법은 'this'키워드를 사용하여 게임에서 이벤트 객체에 대한 포인터를 전달하는 것이 었습니다. 내가이 일을 할 때, 현재 다른 클래스를 포함하려고 시도한 클래스를 포함시키려는 결과로 보이는 컴파일러 오류가있었습니다. (끝내주는 루프 겠지?)

예를 들면. 내 '게임'클래스가 있고 'mapManager'클래스에 속한 공용 멤버가 있습니다. 'mapManager'객체는 'event'객체를 멤버로가집니다. 'game'객체에는 'members'객체가 있습니다. 나는 '플레이어'가 가지고있는 '이벤트'객체 변경 변수가 필요합니다. 솔직히 말해서 필요할 때마다 포인터를 던질 수는 있지만 이것은 번거로울 수 있습니다.

부모님의 자식에게 해당 부모의 다른 자식을 쉽게 액세스 할 수있게하거나 포인터가 필요한 모든 자식 클래스에 포인터를 던지기 쉬울 경우 다른 아이들에게.

와우 ... 그건별로 의미가 없지만 누군가가 나에게 좋은 대답을 줄만큼 충분히 이해할 수 있기를 바랍니다. 도움이 될만한 몇 가지 코드가 있습니다.

:game.h

include "player.h" include "event.h"

class game { public: player Player; event Event; };

:player.h

class player { public: game* Game;

};

:event.h

class event { public: game* Game; };

가 갖는 바로이 "게임 유형의 이름이없는"결과와 그래서 나는 event.h과 player.h 게임을 포함하도록 노력하고 같은 오류가 발생했습니다. 내가하고 싶은 일은 내부 이벤트에서 플레이어의 변수 HP에 액세스 할 수 있습니다.

+1

당신은 관찰자 디자인 패턴의 필요에 소리. 특정 문제에 대한 실질적인 도움을 얻으려면 코드 및 오류를 표시해야합니다. – andre

+0

솔직히 너무 복잡하고 복잡하기 때문에 전체 코드를 게시하고 싶지 않습니다. 샘플 코드를 만들었고 동일한 오류가 발생했습니다. 질문을 편집하여 코드를 포함시킵니다. – Kethaias

답변

3

가능하면 순환 참조를 피하는 것이 좋습니다. 그러나 만약 당신이 정말로하고 싶다면, 해결책은 포인터를 사용하여 헤더 파일의 상단에 클래스 Game을 forward-declare하는 것입니다. 예 :

#ifndef EVENTH 
#define EVENTH 

class Game; 

class Event 
{ 
    Game* game; 
}; 

#endif 

하고 있습니다 .. Game 클래스 SIZEOF, 간단한 미래 선언은 컴파일러를하게하기에 충분/구현에는 knowlege 필요하지 헤더 파일의 경우

#ifndef PLAYERH 
#define PLAYERH 

class Game; 

class Player 
{ 
    Game* game; 
}; 

#endif 

은 알고 그와 클래스 이름이 존재합니다.

Game의 구현이 실제로 중요하고 플레이어/이벤트 구현에서 사용되는 .cpp 소스 파일에서 게임 클래스 정의가 포함 된 헤더가 여전히 #include이어야합니다.

2
//game.h 
class event; 
class game { 
    event _e; 
private: 
    game(){} 
    //game& operator=(game& other) {} 
    ~game(){} 
public: 
    static game & getInstance() { 
     static game instance; 
     return instance; 
    } 
    event& getEvent() {return _e;} 
}; 


//HealEventObserver.h 
class HealEventObserver { 
public: 
    virtual void heal() = 0; 
    virtual ~HealEventObserver(){} 
}; 

//player.h include game.h and HealEventObserver.h event.h 
class Player : public HealEventObserver 
{ 
public: 
    virtual void heal() {/*heal the player*/} 
    Player() { 
     game& instance = game::getInstance(); 
     event& e = instance.getEvent(); 
     e.registerObserver(this); 
    } 
}; 

//event.h include HealEventObserver.h 
class event { 
    std::set<HealEventObserver*> _observers; 
    void notify() { 
     std::set<HealEventObserver*>::iterator it = _observers.begin(); 
     std::set<HealEventObserver*>::iterator end = _observers.end(); 
     for(;it!=end; ++it) { 
      it->heal(); 
     } 
    } 
public: 
    void registerObserver(HealEventObserver* observer) {_observers.insert(observer);} 
}; 

플레이어가 이벤트 개체를 변경하지 않도록 설정하면 이벤트가 플레이어에게 자신을 치료하도록 알려줍니다. 또한 게임이 모든 것을 대표한다고 가정하면 글로벌화합니다. 연구의 비트가 내가 좋은 참조의 이름을 제공이 링크를 발견 한 후 (이건 그냥 내 생각과 다른 것도 있습니다.)

:


는 의견을 답변합니다.

The Definitive C++ Book Guide and List

+0

그 중 대부분은 나에게 완벽하게 이해되는 반면, 이제는 언어 자체에 대해 얼마나 아는 지 알게되었습니다. 그것은 많은 것을 요구할지도 모르지만 당신이 더 진보 된 주제를 다루는 좋은 책으로 나를 가리킬 수있는 방법이 있습니다. 나는 몇 권의 책을 썼지 만 대부분은 더 진보 된 것에 대해서는 세부적으로 언급하지 않고 오히려 그들이 존재한다고 언급한다. 책 일 필요는 없지만 그건 내가 좋아하는 책이다. 그 문제에 대한 도움을 주시면 감사하겠습니다 만, 이미 그렇게 많이 해본 결과, 내가 원하지 않는다면 이해할 수 있습니다. 지금까지 해준 모든 일을 도와 주셔서 감사합니다. – Kethaias

+0

@Kethaias : 위의 의견에 대답했습니다. – andre

+1

cplusplus.com을 사용하지 마십시오. 이 웹 사이트에는 많은 오류가 포함되어 있으며 프로그래밍 실력이 좋지 않습니다. –