1. [代码][C/C++]代码

//Event.h
  
#ifndef _EVENT_H_
#define _EVENT_H_
class EmptyObject {};
template<typename F>
class Event
{
public:
 Event()
  :m_pObjectPtr(NULL),
  m_pMemeberFunctionPtr(NULL)
 {
 }
 virtual ~Event()
 {
  if (m_pMemeberFunctionPtr != NULL)
  {
   delete m_pMemeberFunctionPtr;
   m_pMemeberFunctionPtr = NULL;
  }
 }
 
 template<typename C,typename M>
 Event(C* pObjectPtr,const M& MemeberFunctionPtr)
  : m_pObjectPtr((EmptyObject*)pObjectPtr)
 {
  M* pMFPtr = new M;
  *pMFPtr = MemeberFunctionPtr;
  m_pMemeberFunctionPtr = (F*)pMFPtr;
 }
 Event<F>& operator += (const Event<F>& event)
 {
  if (event.GetObjectPtr() == this->GetObjectPtr() &&
   *event.GetMemeberFunctionPtr() == *this->GetMemeberFunctionPtr())
  {
   return *this;
  } 
  this->m_pObjectPtr = event.GetObjectPtr();
  if (m_pMemeberFunctionPtr != NULL)
  {
   delete m_pMemeberFunctionPtr;
   m_pMemeberFunctionPtr = NULL;
  }
  this->m_pMemeberFunctionPtr = new F;
  *this->m_pMemeberFunctionPtr = *event.GetMemeberFunctionPtr();
  return *this;
 }
 Event<F>& operator -= (const Event<F>& event)
 {
  if (event.GetObjectPtr() == this->GetObjectPtr() &&
   *event.GetMemeberFunctionPtr() == *this->GetMemeberFunctionPtr())
  {
   this->m_pObjectPtr = NULL;
   if (m_pMemeberFunctionPtr != NULL)
   {
    delete m_pMemeberFunctionPtr;
    m_pMemeberFunctionPtr = NULL;
   }
  }
  return *this;
 }
 EmptyObject* GetObjectPtr() const
 {
  return this->m_pObjectPtr;
 }
 F* GetMemeberFunctionPtr() const
 {http://www.huiyi8.com/hunsha/chuangyi/​
  return this->m_pMemeberFunctionPtr;
 }创意婚纱照片
private:
 EmptyObject* m_pObjectPtr;
 F* m_pMemeberFunctionPtr;
};
typedef EmptyObject Delegater;
#define InvokeEvent(EventHandler) \
 if (EventHandler != NULL) \
 if (EventHandler->GetObjectPtr() != NULL && *EventHandler->GetMemeberFunctionPtr() != NULL) \
 ((EventHandler->GetObjectPtr())->*(*EventHandler->GetMemeberFunctionPtr()))
#endif /*_EVENT_H_*/
2. [代码][C/C++]代码

//测试代码:
#include "Event.h"
 
typedef void (Delegater::*ClickEvent)(int);
class CForm
{
public:
 void FormClick()
 {
  InvokeEvent((&OnClick))(10);
 }
 Event<ClickEvent> OnClick;
};
class CWindows
{
public:
 CWindows()
 {
  Form.OnClick += Event<ClickEvent>(this,&CWindows::OnClick);
 }
 void Run()
 {
  Form.FormClick();
 }
 void RemoveEvent()
 {
  Form.OnClick -= Event<ClickEvent>(this,&CWindows::OnClick);
 }
 void OnClick(int n)
 {
  printf("%d\r\n",n);
 }
private:
 CForm Form;
};
int _tmain(int argc, _TCHAR* argv[])
{
 CWindows Windows;
 Windows.Run();
 Windows.RemoveEvent();
 Windows.Run();
 return 0;
}

使用C++模拟C#的委托机制的更多相关文章

  1. 转载 C++实现的委托机制

    转载 C++实现的委托机制 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里http://mygui.info/ 最终的代码 ...

  2. 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)

    最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里,有兴趣的可以去瞧瞧. 突发奇想,想到了既然单片机能够实现,那么我用标 ...

  3. java 类加载器的委托机制

    l 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 1.首先当前线程的类加载器去加载线程中的第一个类. 2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B. 3 ...

  4. 观察者模式模拟YUI事件机制

    首先介绍下YUI的事件机制,很好理解,因为和浏览器事件机制差不多.看懂下面几个方法就可以了: publish: 创建自定义事件.第一个参数是事件类型,第二个参数是一个对象,里面可以设置默认动作 on: ...

  5. [CSP-S模拟测试]:电压机制(图论+树上差分)

    题目描述 科学家在“无限神机”($Infinity\ Machine$)找到一个奇怪的机制,这个机制有$N$个元件,有$M$条电线连接这些元件,所有元件都是连通的.两个元件之间可能有多条电线连接.科学 ...

  6. C++ 0x 使用可变参数模板类 实现 C# 的委托机制

    #ifndef _ZTC_DELEGATE_H_ #define _ZTC_DELEGATE_H_ #include <vector> #include <functional> ...

  7. python 模拟事件触发机制

    EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...

  8. node模拟http服务器session机制-我们到底能走多远系列(36)

    我们到底能走多远系列(36) 扯淡: 年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵.请珍惜! 主题:      我们在编写http请求处理和响应的代码的时 ...

  9. 用C表达面向对象语言的机制——C#版

    PS:本文PDF版在这里(格式更好看一些).最新的源代码请在本页面文末下载,PDF中的链接不是最新的. 用C表达面向对象语言的机制——C#版 我一直认为,面向对象语言是对面向过程语言的封装.如果是这样 ...

随机推荐

  1. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

  2. 【AngularJS】【03】使用AngularJS进行开发

    看不到PPT的请自行解决DNS污染问题.

  3. Interleaving String——是否由两个string交叉、DP

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  4. Snubber电路

    http://www.elecfans.com/yuanqijian/dianrongqi/20170601520736.html https://wenku.baidu.com/view/166f1 ...

  5. cartographer Ubuntu16.04 ros环境配置

    首先要正确安装 ROS ,然后第12步应注意,proto的版本是个关键容易出错.   1.添加ROS源http:/packages.ros.org/ros/ubuntu xenial main   ( ...

  6. shell脚本学习笔记 (流编辑器sed)

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...

  7. 蓝桥杯OJ PREV-19 九宫重排

    题目描写叙述:   历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB        问题描写叙述 如以下第一个图的九宫格中,放着 1~8 的数字卡片.另一个格子空着.与空格子相 ...

  8. HTML元素定位

    一切皆为框 div.h1 或 p 元素常常被称为块级元素(block element).这意味着这些元素显示为一块内容,即"块框".与之相反,span 和 strong 等元素称为 ...

  9. Anaconda2

    Anaconda 是一个打包的python,一次把好多需要的包都安装好了.对于Python2.7把PyQt5都弄好了,不需要自己来编译! 看看这个 http://conda.pydata.org/do ...

  10. js时间戳格式化成日期格式的多种方法

    js需要把时间戳转为为普通格式,一般的情况下可能用不到的, 下面先来看第一种吧 复制代码代码如下: function getLocalTime(nS) { return new Date(parseI ...