【发布时间】:2013-12-16 13:32:42
【问题描述】:
我想用 C++ 在 Windows 编程中模拟 C# 事件驱动编程。
我想以这种方式完成:
- 使用列表容器保存函数指针
- 重写+=操作符,使Event类可以在里面添加函数 这样 event+=handlerFuncName
- 重写 () 操作符,这样我们就可以调用列表中的函数了
事件类:
template<class Sender_Type, class Args_Type>
class Event{
private:
typedef void(*HFUN)(Sender_Type *, Args_Type);
list<HFUN> handlers;
public:
void operator +=(HFUN handler){
handlers.push_back(handler);
}
void operator ()(Sender_Type *sender, Args_Type e){
for (list<HFUN>::iterator it = handlers.begin(); it != handlers.end(); it++)
(*it)(sender, e);
}
~Event(){ printf("Release..\n"); }
};
这是一个例子:
EventArgs 类和窗口类的定义:
class EventArgs{ };
class Win32Window
{
public:
// event definition
Event<Win32Window, EventArgs> Loaded;
// ctor
Win32Window(){
// ...
// trigger the Loaded event
Loaded(this, EventArgs());
}
// ...
};
事件处理函数的定义:
void Window_Loaded(Win32Window *sender, EventArgs e){
MessageBox(NULL, "Window_Loaded", "xx", 0);
}
主要功能:
Win32Window wnd;
//add the event handler function
wnd.Loaded += Window_Loaded;
它可以工作,但是当窗口关闭时,list.clear() 出现运行时错误!
这是一个snapshot 的异常:
【问题讨论】:
-
看不到你的图片...
-
什么是 HFUN?您能否显示初始化和清除此列表的代码,事件处理程序代码的问题不是必需的。请尝试将其减少到SSCCE。
-
成员函数指针显然不是答案。尝试阅读 Functors。
-
typedef void(*HFUN)(Sender_Type *, Args_Type);我还没有调用 clear() 函数。我认为它是在列表发布时自动调用的。对列表(处理程序)的所有操作都显示在这些代码中,不再有任何操作。
-
使用
std::function肯定会让这更容易阅读......而且更安全