Nie jestem zbyt dobry w C++ (ale znam już OOP/Java), ale muszę stworzyć grę dla mojej klasy C++. Chcę ustawić rodzaj silnika gry takiego, jaki jest używany w grach Flash napisanych w języku ActionScript.C++ - Polimorficzny wskaźnik do funkcji składowych
Napisałem to dwie klasy, gdzie Actor
rozumie się jako klasa bazowej (prawdopodobnie będzie streszczenie) i Player
powinny rzeczywiście wdrożyć.
Problemem jest to, że chcę, aby uniknąć powielania kodu w funkcji addEventListener
i handle
i re-deklarujących _handlerMap
, ponieważ chcę osiągnąć ukrywania danych i takie rzeczy.
Problem, domyślam się, że _eventMap
powinien zawierać wartości handler
, które mogą zmienić klasę Actor::*handler
i Player::*handler
. Czy to możliwe?
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;
};
};
życzę można było zadeklarować odtwarzacza jak:
class Player : public Actor {
typedef void(Player::*handler)(Event);
public:
void onWhateverEvent(Event e);
}
Mam nadzieję, że rozumiesz.
Czy chcesz zezwolić na inne instancje 'Actor' zarejestrować obsługi? (tzn. czy 'addEventListener' musi być członkiem publicznym?) – dyp
" Problem, jak sądzę, polega na tym, że '_ventMap'" -> masz na myśli '_handlerMap'? – dyp
Najprostszym rozwiązaniem, jakie mogę sobie wyobrazić, jest użycie 'std :: function' oraz' std :: bind', dostępnych w C++ 11. – dyp