2012-09-26 66 views
2

我目前正在开发一个使用C++的RPG游戏,并且我已经到了在地图上包括事件的地步。访问同一父母的其他孩子的元素的孩子

我想让地图上的事件能够治愈玩家。我认为最简单的方法是使用'this'关键字将指针传递给游戏中的事件对象。当我这样做时,出现了一大堆编译器错误,这些错误似乎是由于试图包含一个当前试图包含其他类的类而导致的。 (无尽循环,我猜?)

例如。我有我的'游戏'类,它有一个属于'mapManager'类的公共成员。 'mapManager'对象将'event'对象作为成员。 '游戏'对象在其成员中也有'玩家'对象。我需要让“事件”对象更改“玩家”所具有的变量。每当我需要它时,我都可以诚实地抛出指针,但这可能会很麻烦。

我想问的是,如果有一个简单的方法让父母的孩子访问该父母的另一个孩子,或者如果它更容易抛出指向所有需要他们指向的孩子类的指针给其他孩子。

哇...这没什么意义,但希望有人能够理解,给我一个很好的答案。这里有一些代码,以防它有帮助。

: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,它将使用引用/指针。例如

#ifndef EVENTH 
#define EVENTH 

class Game; 

class Event 
{ 
    Game* game; 
}; 

#endif 

和..

#ifndef PLAYERH 
#define PLAYERH 

class Game; 

class Player 
{ 
    Game* game; 
}; 

#endif 

对于那些不需要执行knowlege /的sizeof的Game类,一个简单的前瞻性声明是足以让编译器的头文件知道,与一类名称存在。

在你.cpp源文件(其中Game实现是真正重要的,并通过播放器/事件实现中使用),你仍然需要#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。该网站包含很多错误,并促成糟糕的编程习惯。 – 2012-09-28 09:28:12

相关问题