访问同一父级的其他子级元素的子级 我现在正在开发一个使用C++的RPG游戏,我的目标是在地图上包含事件。
我希望能够让地图上的事件治愈玩家。我认为最简单的方法是使用'this'关键字从游戏中传递一个指向事件对象的指针。当我开始这样做时,出现了一大堆编译器错误,这些错误似乎是由于试图包含一个当前正试图包含另一个类的类而导致的。(我猜是无止境的循环?) 比如说。我有我的“游戏”类,它有一个属于“mapManager”类的公共成员。然后,“mapManager”对象将“event”对象作为成员。“游戏”对象的“成员”中也有一个“玩家”对象。我需要让“事件”对象改变“玩家”拥有的变量。老实说,我可以在需要的时候抛出指针,但这可能会很麻烦 我想问的是,是否有一种简单的方法可以让一个家长的孩子访问另一个家长的孩子,或者是否可以更容易地向所有需要他们指向其他孩子的子类抛出指针 哇。。。这没有什么意义,但希望有人能理解,给我一个好的答案。下面是一些代码,以防有所帮助访问同一父级的其他子级元素的子级 我现在正在开发一个使用C++的RPG游戏,我的目标是在地图上包含事件。,c++,pointers,parent,parent-child,member,C++,Pointers,Parent,Parent Child,Member,我希望能够让地图上的事件治愈玩家。我认为最简单的方法是使用'this'关键字从游戏中传递一个指向事件对象的指针。当我开始这样做时,出现了一大堆编译器错误,这些错误似乎是由于试图包含一个当前正试图包含另一个类的类而导致的。(我猜是无止境的循环?) 比如说。我有我的“游戏”类,它有一个属于“mapManager”类的公共成员。然后,“mapManager”对象将“event”对象作为成员。“游戏”对象的“成员”中也有一个“玩家”对象。我需要让“事件”对象改变“玩家”拥有的变量。老实说,我可以在需要的
:game.h
包括“player.h”
包括“event.h”
班级游戏
{
公众:
玩家;
事件;
};
:player.h
职业选手
{
公众:
游戏*游戏
})
:event.h
班级活动
{
公众:
游戏*游戏;
};
这样做的结果是“游戏不命名类型”,所以我尝试将游戏包含在event.h和player.h中,得到了相同的错误。我想做的是能够从内部事件访问玩家的变量HP。最好尽可能避免循环引用;但是,如果您确实想这样做,那么解决方案是在头文件的顶部向前声明您的类
Game
,它将使用指向它的引用/指针。e、 g
#ifndef EVENTH
#define EVENTH
class Game;
class Event
{
Game* game;
};
#endif
和
对于不需要知道Game
类的实现/大小的头文件,一个简单的正向声明就足以让编译器知道存在一个具有该名称的类
在.cpp
源文件中(其中游戏
的实现实际上很重要,并且由玩家/事件实现使用),您仍然需要#包含包含游戏类定义的头。//Game.h
//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);}
};
班级活动;
班级游戏{
事件;;
私人:
游戏(){}
//游戏和操作符=(游戏和其他){}
~game(){}
公众:
静态游戏&getInstance(){
静态游戏实例;
返回实例;
}
event&getEvent(){return}
};
//healventobserver.h
类healventobserver{
公众:
虚拟空洞愈合()=0;
虚拟~healventobserver(){}
};
//h包括game.h和healventobserver.h event.h
类播放器:公共healventobserver
{
公众:
虚拟虚空治疗(){/*治疗玩家*/}
玩家(){
game&instance=game::getInstance();
event&e=instance.getEvent();
e、 registerObserver(此);
}
};
//h包括healventobserver.h
班级活动{
std::set_观察器;
作废通知(){
std::set::iterator it=_observators.begin();
std::set::iterator end=_obsers.end();
for(;it!=end;++it){
它->治愈();
}
}
公众:
void registerObserver(healventobserver*observer){{u observer.insert(observer);}
};
不要让你的事件对象改变玩家,只要让事件告诉玩家自己治疗即可。同样,若游戏被认为代表了一切,那个么就让它全球化
回答评论:(这只是我的意见,没有别的。)
经过一点研究,我发现了这个链接,它给出了一些重要参考文献的名称
听起来您需要observer设计模式。您需要显示代码和错误,才能在特定问题上获得真正的帮助。我不想发布我的全部代码,因为老实说,它太混乱和复杂了。我做了一些示例代码,我得到了相同的错误。我将编辑这个问题以包含代码。虽然大部分内容对我来说非常有意义,但我现在意识到我对语言本身所知甚少。这可能要求很多,但你有没有办法让我读一本涵盖更高级主题的好书。我有几本书,但大多数都没有详细介绍更高级的东西,只是提到它们的存在。不一定是书,但这是我的偏好。我很感谢你在这件事上的任何帮助,但你已经做了这么多,如果你不愿意的话,我能理解。谢谢你迄今为止为帮助我所做的一切。@Kethaias:我回答了你上面的评论。不要使用cplusplus.com。该网站包含大量错误,并推广糟糕的编程实践。@jons34yp我将更改链接。你知道stl集装箱和货物的好参考网站吗?我通常使用。顺便说一下,不要把C++标准库称为STL,STL是SGI实现C++标准库的一种实现方式。
//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);}
};