当前位置:编程学习 > C/C++ >>

C++实现C#的事件机制

 

  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

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,