C++'da pek iyi değilim (ama OOP/Java'yı tanıyorum) ama C++ sınıfım için bir oyun oluşturmam gerekiyor. ActionScript'te yazılmış Flash oyunlar için kullanılan bir tür oyun motoru kurmak istiyorum. C++ - Üye işlevlerine polimorfik işaretçi
ben (muhtemelen soyut olacaktır) vePlayer
aslında uygulamalıdır
Actor
bir
temel sınıf olarak içindir bu iki sınıf yazdı.
sorun
ben veri saklamayı ve bu tür şeyleri başarmak istiyoruz çünkü fonksiyonlarıaddEventListener
ve
handle
ve
_handlerMap
yeniden ilan yinelenen kod önlemek istiyorum olmasıdır.
sorun, sanırım, _eventMap
sınıf Actor::*handler
ve Player::*handler
değiştirebilir handler
değerleri içeren gerektiğidir. Mümkün mü?
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;
};
};
Ben o kadar Player bildirmek mümkün olsaydı:
class Player : public Actor {
typedef void(Player::*handler)(Event);
public:
void onWhateverEvent(Event e);
}
Umarım anlarsın.
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);
}
}
Şimdi aktörün her tür T
bir DispatcherImpl<T>
kendi edelim ve tüm ayarlanır:
bir işleyici kayıt 'Actor' diğer örneklerini izin vermek istiyor musunuz:
sadece Kullanmak için (Dispatcher yukarıdaki DispatcherImpl aynıdır)? (yani, addEventListener’ın halka açık olması gerekir mi?) – dyp
"Sorun, sanırım" _eventMap' "-> _handlerMap' anlamına mı geliyor? – dyp
Düşünebildiğim en basit çözüm, C++ 11'de bulunan 'std :: function' ve' std :: bind' kullanmaktır. – dyp