Bunun pek çok kez sorulduğunu biliyorum ve bu nedenle, püf noktasını kazmak ve neyin işe yaradığına dair basit bir örnek bulmak zor.
Bunu anladım, basit ve işe yarıyor MyClass
...
#include <iostream>
using std::cout;
using std::endl;
class MyClass
{
public:
MyClass();
static void Callback(MyClass* instance, int x);
private:
int private_x;
};
class EventHandler
{
public:
void addHandler(MyClass* owner)
{
cout << "Handler added..." << endl;
//Let's pretend an event just occured
owner->Callback(owner,1);
}
};
EventHandler* handler;
MyClass::MyClass()
{
private_x = 5;
handler->addHandler(this);
}
void MyClass::Callback(MyClass* instance, int x)
{
cout << x + instance->private_x << endl;
}
int main(int argc, char** argv)
{
handler = new EventHandler();
MyClass* myClass = new MyClass();
}
class YourClass
{
public:
YourClass();
static void Callback(YourClass* instance, int x);
};
Bu nasıl yeniden yazılabilir, böylece EventHandler::addHandler()
hem MyClass
ve hem de ile çalışacaktır YourClass
. Üzgünüm ama beynimin çalışma şekli bu, neden / nasıl çalıştığını anlamadan önce neyin işe yaradığına dair basit bir örnek görmem gerekiyor. Bu işi yapmak için favori bir yolunuz varsa, şimdi onu gösterme zamanı, lütfen bu kodu işaretleyin ve geri gönderin.
[Düzenle]
Yanıtlandı ancak ben onay işaretini veremeden yanıt silindi. Benim durumumdaki cevap şablonlu bir işlevdi. AddHandler buna değiştirildi ...
class EventHandler
{
public:
template<typename T>
void addHandler(T* owner)
{
cout << "Handler added..." << endl;
//Let's pretend an event just occured
owner->Callback(owner,1);
}
};