Tôi biết điều này đã được hỏi rất nhiều lần, và do đó, rất khó để tìm hiểu sơ bộ và tìm một ví dụ đơn giản về những gì hoạt động.
Tôi đã có cái này, nó đơn giản và nó hoạt động cho 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);
};
Làm thế nào mà có thể được viết lại như vậy EventHandler::addHandler()
sẽ làm việc với cả hai MyClass
và YourClass
. Tôi xin lỗi nhưng đó chỉ là cách bộ não của tôi hoạt động, tôi cần xem một ví dụ đơn giản về những gì hoạt động trước khi tôi có thể hiểu tại sao / cách nó hoạt động. Nếu bạn có một cách yêu thích để biến nó thành công việc này, bây giờ là lúc để thể hiện nó, vui lòng đánh dấu mã đó và đăng lại.
[biên tập]
Nó đã được trả lời nhưng câu trả lời đã bị xóa trước khi tôi có thể đánh dấu chọn. Câu trả lời trong trường hợp của tôi là một hàm mẫu. Đã thay đổi addHandler thành này ...
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);
}
};