2

現在、C ++を使用してRPGゲームを開発しており、マップにイベントを含めることができるようになりました。

マップ上のイベントでプレイヤーを癒してもらいたかったのです。これを行う最も簡単な方法は、「this」キーワードを使用してゲームからイベントオブジェクトへのポインターを渡すことであると考えました。私がこれを始めたとき、現在他のクラスを含めようとしていたクラスを含めようとした結果として生じたと思われるコンパイラエラーがたくさんありました。(私が推測する無限のループ?)

例えば。「game」クラスがあり、「mapManager」クラスに属するパブリックメンバーがあります。'mapManager'オブジェクトには、'event'オブジェクトがメンバーとして含まれます。'game'オブジェクトには、'メンバー内に'player'オブジェクトもあります。'player'が持っている'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にアクセスできるようにすることです。

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ソースファイル(の実装が実際に重要であり、Player / Eventの実装によって使用される場合)では、ゲームクラス定義を含むヘッダーがGame必要になります。#include

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

イベントオブジェクトにプレイヤーを変更させないでください。イベントにプレイヤーに自分自身を癒すように指示させるだけです。また、ゲームがすべてを表すと想定されている場合は、それをグローバルにします。


コメントに答えるには:(これは私の意見であり、他には何もありません。)

少し調べてみたところ、すばらしい参考文献の名前が記載されているこのリンクを見つけました。

決定的なC++ブックガイドとリスト

于 2012-09-26T21:15:48.173 に答える