C++中回调函数的封装——使用

 本文是上一篇文章中实现代码的具体使用实例。

  1. #include "MultiCB.h"
  2. using namespace std;
  3. using namespace MultiCB;
  4. class EventArgs
  5. {
  6. public:
  7.     EventArgs()
  8.     {
  9.         Name = "EventArgs";
  10.     }
  11.     string Name;
  12.     void TestMemFunc(EventArgs* arg)
  13.     {
  14.         cout << arg->Name.c_str() << endl;
  15.     }
  16. };
  17. class EvtArgs2 : public EventArgs
  18. {
  19. public:
  20.     EvtArgs2()
  21.     {
  22.         Name = "EvtArgs2";
  23.     }
  24. };
  25. void TestGlbFunc1(EventArgs* arg)
  26. {    
  27.     cout << "TestGlbFunc1: " << arg->Name.c_str() << endl;
  28. }
  29. void TestGlbFunc2(EventArgs* arg)
  30. {    
  31.     cout << "TestGlbFunc2: " << arg->Name.c_str() << endl;
  32. }
  33. class StaticClass
  34. {
  35. public:
  36.     static void Func(EventArgs* arg)
  37.     {
  38.         cout << "StaticClass::Func: " << arg->Name.c_str() << endl;
  39.     }
  40. };
  41. typedef void(*GlbFuncType)(EventArgs*);
  42. void TestStaticCallBack()
  43. {       
  44.     cout << "Test the StaticCallBack" << endl;
  45.     StaticCallBack<GlbFuncType, EventArgs> stEvent;
  46.     EventArgs evtArg;
  47.     stEvent.Raise(&evtArg);
  48.     cout << endl;
  49.     stEvent.Register(&TestGlbFunc1);
  50.     stEvent.Raise(&evtArg);
  51.     cout << endl;
  52.     stEvent.Register(&TestGlbFunc2);
  53.     stEvent.Raise(&evtArg);
  54.     cout << endl;
  55.     stEvent.UnRegister(&TestGlbFunc1);
  56.     stEvent.Raise(&evtArg);
  57.     cout << endl;
  58.     stEvent.Register(&TestGlbFunc1);
  59.     stEvent.Raise(&evtArg);
  60.     cout << endl;
  61.     stEvent.Register(&TestGlbFunc1);
  62.     stEvent.Raise(&evtArg);
  63.     cout << endl;
  64.     EvtArgs2 arg2;
  65.     stEvent -= &TestGlbFunc1;
  66.     stEvent.Raise(&arg2);
  67.     cout << endl;
  68.     stEvent += &TestGlbFunc2;
  69.     stEvent.Raise(&arg2);
  70.     cout << endl;
  71.     stEvent += &TestGlbFunc1;
  72.     stEvent.Raise(&arg2);
  73.     cout << endl;
  74.     stEvent += &StaticClass::Func;
  75.     stEvent.Raise(&arg2);
  76.     cout << endl;
  77.     stEvent.Clear();
  78.     stEvent.Raise(&arg2);
  79.     cout << endl;
  80. }
  81. class UserClass1
  82. {
  83. public:
  84.     void Func1(EventArgs* arg)
  85.     {
  86.         cout << "UserClass1::Func1 " << arg->Name.c_str() << endl;
  87.     }
  88.     virtual void VirtualFunc(EventArgs* arg)
  89.     {
  90.         cout << "UserClass1::VirtualFunc " << arg->Name.c_str() << endl;
  91.     }
  92. };
  93. class UserClass2 : public UserClass1
  94. {
  95. public:
  96.     void VirtualFunc(EventArgs* arg)
  97.     {
  98.         cout << "UserClass2::VirtualFunc " << arg->Name.c_str() << endl;
  99.     }
  100. };
  101. class UserClass3 : public UserClass2
  102. {
  103. public:
  104.     void VirtualFunc(EventArgs* arg)
  105.     {
  106.         cout << "UserClass3::VirtualFunc " << arg->Name.c_str() << endl;
  107.     }
  108. };
  109. typedef void (UserClass1::*MemFuncType)(EventArgs* arg);
  110. void TestClassCallBack()
  111. {
  112.     typedef ClassCallBack<UserClass1,MemFuncType,EventArgs> Event;
  113.     Event clsEvt;
  114.     Event::Pair pair;
  115.     UserClass1 cls1;
  116.     UserClass2 cls2;
  117.     UserClass3 cls3;
  118.     EventArgs evtArg;
  119.     EvtArgs2 evtArg2;
  120.     pair.func = &UserClass1::Func1;
  121.     pair.obj = &cls1;
  122.     clsEvt.Register(pair);
  123.     clsEvt.Raise(&evtArg);
  124.     cout << endl;
  125.     pair.func = &UserClass1::VirtualFunc;
  126.     pair.obj = &cls1;
  127.     clsEvt.Register(pair);
  128.     clsEvt.Raise(&evtArg);
  129.     cout << endl;
  130.     //pair.func = &UserClass2::VirtualFunc;
  131.     pair.func = &UserClass1::VirtualFunc;
  132.     pair.obj = &cls2;
  133.     clsEvt.Register(pair);
  134.     clsEvt.Raise(&evtArg2);
  135.     cout << endl;
  136.     pair.func = &UserClass1::Func1;
  137.     pair.obj = &cls2;
  138.     clsEvt += pair;
  139.     clsEvt.Raise(&evtArg2);
  140.     cout << endl;
  141.     pair.func = &UserClass1::VirtualFunc;
  142.     pair.obj = &cls1;
  143.     clsEvt -= pair;    
  144.     clsEvt.Raise(&evtArg2);
  145.     cout << endl;
  146.     pair.func = &UserClass1::VirtualFunc;
  147.     pair.obj = &cls3;
  148.     clsEvt += pair;    
  149.     clsEvt.Raise(&evtArg2);
  150.     cout << endl;
  151. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值