Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

【原创】借助Functor用C++实现类似C#的Event对象

来源: 未知 分享至:

好久没用C++了,今天整理以前写的代码,发现一个以前用C++写的Event模板类,

虽然写出来之后都没怎么用过,不过个人感觉应该蛮好用的,这里贴出来,大家帮忙找找碴。

1,使用方法

 先看看这个Event类怎么使用的吧:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

#include <stdio.h>
#include <vector>
#include \"Event.h\" // 引用头文件

typedef Event<TYPE_LIST2(int, int)> EventIntIntType; // typedef 一下模板类型, 当然你也可以不定义

// 指挥官
class Commander
{
public:
  EventIntIntType TargetChangedEvent; // 定义事件

  void ChangeTarget(int x, int y)
  {
    // 所有听到这个广播的士兵,向目标进发
    TargetChangedEvent(x, y); // 广播事件
  }
};

// 士兵
class Soldier
{
public:
  Soldier(int id, Commander* commander)
   : _id(id)
   , _commander(commander)
  {
    // 监听指挥官的广播 
     _commander->TargetChangedEvent.Add(EventIntIntType::Handler(this, &Soldier::ChangeTarget)); // 注册事件

    // 这里也可以这样使用
    // Functor<void, TYPE_LIST2(int, int)> functor(this, &Soldier::ChangeTarget);
    // _commander->TargetChangedEvent.Add(functor);
  }

  ~Soldier()
  {
    printf(\"Soldier No%d is dead!nn\", _id);
    // 我牺牲了,指挥官不要给我发广播了
    _commander->TargetChangedEvent.Remove(EventIntIntType::Handler(this, &Soldier::ChangeTarget)); // 注消事件
  }

  void ChangeTarget(int x, int y)
  {
    printf(\"Soldier No%d changed target to location(%d, %d)n\", _id, x, y);
  }

private:
  int _id;
  Commander* _commander;
};

int _tmain(int argc, _TCHAR* argv[])
{
  Commander commander;
  Soldier *soldier1, *soldier2, *soldier3;
  soldier1 = new Soldier(111, &commander);
  soldier2 = new Soldier(222, &commander);
  soldier3 = new Soldier(333, &commander);
  commander.ChangeTarget(100, 100);

  delete soldier2;

  commander.ChangeTarget(200, 200);

  return 0;
}

 

简单说明一下示例程序,程序里有两个类,指挥官Commander类和士兵Soldier类

Commander类中定义了一个事件对象:

EventIntIntType TargetChangedEvent; // 定义事件
 这个EventIntIntType是在前面typedef的模板类型定义:

typedef Event<TYPE_LIST2(int, int)> EventIntIntType;

这个TYPE_LIST2是一个宏定义,就是类型列表,

因为这里定义的是两个int参数的事件,所以使用TYPE_LIST2

当然也有,

TYPE_LIST1

TYPE_LIST2

……

最多到

TYPE_LIST


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史