C#的事件机制让C#程序员如鱼得水,尤其在架构的时候,事件驱动机制让弱耦合成为一种主流。但对于我们从事C++开发的程序员来说,心理甚是羡慕嫉妒恨,尤其像我这种半路从C#出家C++的。
本文实现的是C++模仿C#的事件。
与C#的事件机制表现形式比较:
相似点:采用+=、-=运算符实现事件注册注销工作
差异点:本文中使用事件的类,第一个成员变量必须是CObjectSender ,自定义事件类第一个成员变量必须为EventArgs。
测试类:
1 #include "stdafx.h"
2 #include
3 #include
4 #include
5 #include "HunterEvent.h"
6 using namespace std;
7
8 // 事件参数
9 class MyEventArgs
10 {
11 public:
12 EventArgs args;
13 int age;
14 };
15
16 // 学生类,测试类
17 class Student
18 {
19 private:
20 ObejctSender sender;
21 int age;
22
23 public:
24 HunterEvent m_event;
25
26 // 设置年龄
27 void SetAge(int p)
28 {
29 age = p;
30 }
31
32 // 获取年龄
33 int GetAge()
34 {
35 return age;
36 }
37
38 // 事件触发器
39 void Trigger()
40 {
41 MyEventArgs arg;
42 arg.age = age;
43 m_event.Trigger(&sender, &arg.args);
44 }
45 };
46
47 void MMSSS(ObejctSender* sender, EventArgs* args)
48 {
49 int temp1 = ((Student*)sender)->age;
50 int temp2 = ((MyEventArgs*)args)->age;
51 cout<<"1111 sender "<<" eventargs "< 52 } 53 54 void SSSMM(ObejctSender* sender, EventArgs* args) 55 { 56 int temp1 = ((Student*)sender)->age; 57 int temp2 = ((MyEventArgs*)args)->age; 58 cout<<"2222 sender "<<" eventargs "< 59 } 60 61 int _tmain(int argc, _TCHAR* argv[]) 62 { 63 cout<<"未绑定事件"<<'\n'; 64 Student s; 65 s.Trigger(); 66 67 cout< 68 69 cout<<"绑定MMSSS事件,10岁"<<'\n'; 70 s.SetAge(10); 71 s.m_event += MMSSS; 72 s.Trigger(); 73 74 75 cout<<"绑定MMSSS与SSSMM事件,10岁"<<'\n'; 76 s.m_event += SSSMM; 77 s.Trigger(); 78 79 cout<<"绑定MMSSS与SSSMM事件,20岁"<<'\n'; 80 s.SetAge(20); 81 s.Trigger(); 82 83 cout<<"注销MMSSS事件,20岁"<<'\n'; 84 s.m_event -= MMSSS; 85 s.Trigger(); 86 system("PAUSE"); 87 return 0; 88 } 运行结果: 源码下载地址:http://download.csdn.net/detail/fryhunter/3828019 作者 BLoodMaster