2

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

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

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

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

哇......这没什么意义,但希望有人能理解到足以给我一个好的答案。这是一些代码,以防万一。

: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。

4

2 回答 2

3

最好尽可能避免循环引用;但是,如果您真的想这样做,那么解决方案是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 类定义的标头。

于 2012-09-26T21:12:43.517 回答
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

于 2012-09-26T21:15:48.173 回答