ฉันรู้ว่ามีการถามเรื่องนี้หลายครั้งและด้วยเหตุนี้จึงเป็นการยากที่จะขุดผ่านปมและหาตัวอย่างง่ายๆว่าอะไรได้ผล
ฉันมีสิ่งนี้มันง่ายและใช้ได้กับ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);
};
จะเขียนใหม่ได้อย่างไรจึงEventHandler::addHandler()
จะใช้ได้กับทั้งสองMyClass
และYourClass
. ฉันขอโทษ แต่มันเป็นเพียงวิธีการทำงานของสมองฉันต้องดูตัวอย่างง่ายๆของสิ่งที่ได้ผลก่อนที่ฉันจะเข้าใจว่าทำไม / มันทำงานอย่างไร หากคุณมีวิธีที่ชื่นชอบในการทำให้งานนี้เป็นเวลาที่จะแสดงมันออกมาโปรดมาร์กอัปรหัสนั้นและโพสต์กลับ
[แก้ไข]
ได้รับคำตอบ แต่คำตอบถูกลบก่อนที่ฉันจะให้เครื่องหมายถูก คำตอบในกรณีของฉันคือฟังก์ชันเทมเพลต เปลี่ยน addHandler เป็นสิ่งนี้ ...
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);
}
};