使用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;
}
最新文章
- (转)TortoiseSVN客户端重新设置用户名和密码
- 用Ant实现Java项目的自动构建和部署
- CodeForces 628B New Skateboard
- Understanding CloudStack’s Physical Networking Architecture
- .PIG File
- 折腾iPhone的生活——iPhone 5s 开启 assistive touch 后卡顿的问题
- PHP MySQL 插入多条数据
- 自定义带弹性效果的pageControl
- this和$(this)
- 来一波CSS兼容问题小总结吧
- 统计细菌基因组ORF
- samba、ftp和ssh服务
- MySQL注入技巧性研究
- Bilinear CNN与 Randomly Wired Neural Network
- [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass
- Azkaban-2.5.0-部署与常见案例
- 【转】Java异常总结和Spring事务处理异常机制浅析
- python windows 下pip easy_install 使用错误的问题
- CrystalReports2007安装包
- Camtasia Studio CamStudio如何不录制鼠标
热门文章
- JAVA Eclipse创建的Android程序如何不显示标题栏
- 【Python】向函数传递列表
- 代理server的概要知识
- 强制重启Linux系统的几种方法
- 【BLE】CC2541之自己定义按键
- 把握linux内核设计思想(二):硬中断及中断处理
- unbuntu16.04上python开发环境搭建建议
- FileInputStream 的读取操作
- window+Jira+SQL Server
- StringBuilder的append、StringBuffer的append和String str = ";a";+";b";的区别?