私はC++にあまりよく似ていません(しかし、私はOOP/Javaに精通しています)が、私のC++クラス用のゲームを作成する必要があります。私は、ActionScriptで書かれたFlashゲームのような種類のゲームエンジンをセットアップしたいと思っています。C++ - メンバ関数への多態ポインタ
私は基底クラス(おそらく抽象的になります)とPlayer
が実際にそれを実装する必要がありますようActor
を意味している。この2つのクラスを、書きました。
addEventListener
とhandle
のコードが重複するのを避け、_handlerMap
を再宣言したいので、データ隠蔽などを実現したいからです。
_eventMap
には、Actor::*handler
とPlayer::*handler
を変更できる値の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;
};
};
私はとプレイヤーを宣言することが可能であった希望:私はあなたが理解してほしい
class Player : public Actor {
typedef void(Player::*handler)(Event);
public:
void onWhateverEvent(Event e);
}
。あなたはこのような何か(テストしていません)必要
あなたは 'Actor'の他のインスタンスがハンドラを登録できるようにしたいですか? (つまり、 'addEventListener'はpublicメンバでなければなりません) – dyp
"問題は、 '_eventMap'" - > '_handlerMap'を意味するのでしょうか? – dyp
私が考えることができる最も簡単な解決策は、C++ 11で利用可能な 'std :: function'と' std :: bind'を使うことです。 – dyp