子级访问同一父级的其他子级的元素

Children Accessing Elements of Other Children of the Same Parent

本文关键字:元素 其他 访问      更新时间:2023-10-16

我目前正在使用C++开发一款RPG游戏,我已经到了在地图上包含事件的地步。

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

例如。我有我的"game"类,它有一个属于"mapManager"类的公共成员。然后,"mapManager"对象将"event"对象作为成员。"game"对象的"成员"中也有一个"player"对象。我需要"玩家"拥有的"事件"对象更改变量。我可以诚实地在需要的时候投进球,但这可能会变得麻烦。

我想问的是,是否有一种简单的方法可以让父母的一个孩子访问该父母的另一个孩子,或者是否可以更容易地将指针指向所有需要它们的子类,指向其他孩子。

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

: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; };

这样做会导致"game不命名类型",所以我试图将game包含在event.h和player.h中,但也出现了同样的错误。我想做的是能够从事件内部访问玩家的可变生命值。

最好尽可能避免循环引用;但是,如果真的想要这样做,那么解决方案是在头文件的顶部转发声明您的类Game,该头文件将使用对它的引用/指针。例如

#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的实现实际上很重要,并且由Player/Event实现使用),您仍然需要#include包含Game类定义的标头。

//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);}
};

不要让你的事件对象改变玩家,只要让事件告诉玩家治愈自己。另外,若假设游戏代表一切,那个么就把它变成全球性的。


回答评论:(这只是我的意见,没有其他。)

经过一点研究,我发现了这个链接,提供了伟大的参考名称。

最终的C++图书指南和列表

相关文章: