我目前正在使用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。
答案 0 :(得分:3)
最好尽可能避免使用循环引用;但是如果你真的想要这样做,那么解决方案是在头文件的顶部转发声明你的类Game
,它将使用引用/指针。 e.g。
#ifndef EVENTH
#define EVENTH
class Game;
class Event
{
Game* game;
};
#endif
和..
#ifndef PLAYERH
#define PLAYERH
class Game;
class Player
{
Game* game;
};
#endif
对于不需要知道Game
类的实现/大小的头文件,一个简单的前向声明就足以让编译器知道具有该名称的类存在。
在.cpp
源文件中(Game
的实现实际上很重要且由播放器/事件实现使用),您仍然需要#include
包含您的Game类定义的标头
答案 1 :(得分: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);}
};
不要让你的事件对象改变玩家只是让事件告诉玩家自己治疗。此外,如果游戏被假定为代表一切,那么将其全局化。
回答评论:(这只是我的观点而已。)
经过一番研究后,我发现这个链接给出了很好的参考名称。