C#的事件機制讓C#程序員如魚得水,尤其在架構的時候,事件驅動機制讓弱耦合成為一種主流。但對於我們從事C++開發的程序員來說,心理甚是羨慕嫉妒恨,尤其像我這種半路從C#出家C++的。
本文實現的是C++模仿C#的事件。
與C#的事件機制表現形式比較:
相似點:采用+=、-=運算符實現事件注冊注銷工作
差異點:本文中使用事件的類,第一個成員變量必須是CObjectSender ,自定義事件類第一個成員變量必須為EventArgs。
測試類:
1 #include "stdafx.h"
2 #include <string>
3 #include <iostream>
4 #include <list>
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 "<<temp2<<'\n';
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 "<<temp2<<'\n';
59 }
60
61 int _tmain(int argc, _TCHAR* argv[])
62 {
63 cout<<"未綁定事件"<<'\n';
64 Student s;
65 s.Trigger();
66
67 cout<<sizeof(Student)<<'\n';
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