【发布时间】:2013-06-06 14:29:01
【问题描述】:
我不太擅长 C++(但我熟悉 OOP/Java),但我必须为我的 C++ 类创建一个游戏。我想设置一种游戏引擎,类似于用 ActionScript 编写的 Flash 游戏。
我编写了这两个类,其中Actor 是一个基类(可能是抽象的),Player 应该实际实现它。
问题是我想避免函数addEventListener和handle中的重复代码并重新声明_handlerMap,因为我想实现数据隐藏等。
我猜,问题在于_eventMap 应该包含handler 可以更改类Actor::*handler 和Player::*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);
}
希望你能理解。
【问题讨论】:
-
是否允许
Actor的其他实例注册处理程序? (即addEventListener必须是公共成员吗?) -
“问题,我猜,是
_eventMap” -> 你是说_handlerMap吗? -
我能想到的最简单的解决方案是使用
std::function和std::bind,在 C++11 中可用。