使用C++模拟C#的委托机制
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#的委托机制的更多相关文章
- 转载 C++实现的委托机制
转载 C++实现的委托机制 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里http://mygui.info/ 最终的代码 ...
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里,有兴趣的可以去瞧瞧. 突发奇想,想到了既然单片机能够实现,那么我用标 ...
- java 类加载器的委托机制
l 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 1.首先当前线程的类加载器去加载线程中的第一个类. 2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B. 3 ...
- 观察者模式模拟YUI事件机制
首先介绍下YUI的事件机制,很好理解,因为和浏览器事件机制差不多.看懂下面几个方法就可以了: publish: 创建自定义事件.第一个参数是事件类型,第二个参数是一个对象,里面可以设置默认动作 on: ...
- [CSP-S模拟测试]:电压机制(图论+树上差分)
题目描述 科学家在“无限神机”($Infinity\ Machine$)找到一个奇怪的机制,这个机制有$N$个元件,有$M$条电线连接这些元件,所有元件都是连通的.两个元件之间可能有多条电线连接.科学 ...
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
#ifndef _ZTC_DELEGATE_H_ #define _ZTC_DELEGATE_H_ #include <vector> #include <functional> ...
- python 模拟事件触发机制
EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...
- node模拟http服务器session机制-我们到底能走多远系列(36)
我们到底能走多远系列(36) 扯淡: 年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵.请珍惜! 主题: 我们在编写http请求处理和响应的代码的时 ...
- 用C表达面向对象语言的机制——C#版
PS:本文PDF版在这里(格式更好看一些).最新的源代码请在本页面文末下载,PDF中的链接不是最新的. 用C表达面向对象语言的机制——C#版 我一直认为,面向对象语言是对面向过程语言的封装.如果是这样 ...
随机推荐
- hosts.allow、hosts.deny无效查看服务是否支持tcp_Wrappers
通过配置hosts.allow.hosts.deny,控制SSH限制固定IP登陆 按照以往的方法,分别在hosts.allow.hosts.deny加入以下配置 # more /etc/hosts.a ...
- hdu 5444 Elven Postman(长春网路赛——平衡二叉树遍历)
题目链接:pid=5444http://">http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limi ...
- vue install 注册组件
1.myPlugin.js文件 let MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue. ...
- 【BIEE】BIEE报表根据维度表展示事实表不存在的维度
事实表数据 维度表数据 现在报表展示如下: 这样展示报表让人感觉数据缺失了,需要显示成如下样子,感觉会比较舒服一点 那么,如何实现上面的完美操作呢? 实现步骤 分析编辑页面→表视图属性→包含仅具有空行 ...
- 用递归法将一个整数n转换成字符串。
用递归法将一个整数n转换成字符串. 比如,输入483,应输出字符串"483".n的位数不确定,能够是随意位数的整数. #include "stdafx.h" # ...
- OS开发之旅之App的生命周期【转载】
原文链接 http://www.360doc.com/content/15/0918/14/27799428_499912639.shtml 在iOS App中,入口函数并不在根目录下,而是在“Sup ...
- win7查看端口占用
1.查看谁占用了我们的80端口,在windows命令行窗口下执行: netstat -aon|findstr 80 发现80端口被进程号为2596的进程占用.2.查看占用80端口进程的应用程序是什 ...
- 近期公共祖先(LCA)——离线Tarjan算法+并查集优化
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...
- uboot生成随机的MAC地址
转载:http://blog.chinaunix.net/uid-25885064-id-3303132.html 在使用U-boot时,有个问题就是MAC地址的设置,如果MAC地址相同的两块开发板在 ...
- 解决ListView滑动时出现黑边的问题
[声明]转载请注明出处,此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --尊重作者,知识无价.交流无限! 两种方法 1.代码去边缘线 myList.setF ...