5

我不太擅长 C++(但我熟悉 OOP/Java),但我必须为我的 C++ 类创建一个游戏。我想设置一种游戏引擎,例如用于用 ActionScript 编写的 Flash 游戏。

我写了这两个类,其中Actor的意思是作为一个基类(可能是抽象的)并且Player应该实际实现它。

问题是我想避免函数中的重复代码addEventListenerhandle重新声明_handlerMap,因为我想实现数据隐藏等。

我猜,问题在于它_eventMap应该包含handler可以更改类Actor::*handlerPlayer::*handler. 可能吗?

    class Actor {
    protected:
        typedef void(Actor::*handler)(Event);
        map<int, handler> _handlerMap;
    public:
        virtual void addEventListener(int ID, handler h) {
            _handlerMap.insert(std::make_pair(ID, h));
        };
        virtual void handle(int ID) {
            handler h = _handlerMap[ID];
            Event e;
            if (h)
                (this->*h)(e);
        }
        virtual void onUpdate(Event e) {
            cout << "Actor::onUpdate()" << endl;
        };
    };

class Player : public Actor {
    typedef void(Player::*handler)(Event);
    map<int, handler> _handlerMap;
public:
    void addEventListener(int ID, handler h) {
        _handlerMap.insert(std::make_pair(ID, h));
    };
    void handle(int ID) {
        handler h = _handlerMap[ID];
        Event e;
        if (h)
            (this->*h)(e);
    }
    void onKeydown(Event e) {
        cout << "Player::onKeyDown()" << endl;
    };
};

我希望可以将 Player 声明为:

class Player : public Actor {
        typedef void(Player::*handler)(Event);
 public:
        void onWhateverEvent(Event e);
 }

我希望你明白。

4

2 回答 2

2

你需要这样的东西(未经测试):

class Dispatcher {
  public:
    virtual void dispatchEvent(Event*) = 0;
};

template <class C>
class DispatcherImpl : public Dispatcher
{
    typedef void(C::*handler)(Event* e);
    std::map<int, handler> _handlerMap;
    C* _owner;
  public:
    DispatcherImpl (C* c) : _owner(c) {}
    addEventListener(int ID, handler h) {
        _handlerMap.insert(std::make_pair(ID, h));
    }        
    void dispatchEvent(Event*)
    {
      handler h = handlerMap[e->id];
      if (h) (_owner->*h)(e);
    }
}

现在让每种类型T的演员都拥有一个DispatcherImpl<T>,你就准备好了。您可能还拥有例如Player继承自DispatcherImpl<Player>.

于 2013-06-06T14:58:49.507 回答
0

你觉得这怎么样?(Dispatcher 和上面的 DispatcherImpl 一样)

template <class T>
class Entity {
    T *_instance;
    Dispatcher<T> *_dispatcher;
public:
    Entity() {
        _instance = new T();
        _dispatcher = new Dispatcher<T>(_instance);
    }
};
class Actor {
    //attirbutes and methods
};
class Player : public Actor {
    //attirbutes and methods
};

要使用它:

Entity<Actor> *actor = new Entity<Actor>();
Entity<Player> *player = new Entity<Player>();
actor->getDispatcher()->addEventListener(0, &Actor::foo);
player->getDispatcher()->addEventListener(1, &Player::bar);
player->getDispatcher()->addEventListener(0, &Actor::foo); //inheritance
于 2013-06-08T07:50:06.097 回答