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;
}

最新文章

  1. (转)TortoiseSVN客户端重新设置用户名和密码
  2. 用Ant实现Java项目的自动构建和部署
  3. CodeForces 628B New Skateboard
  4. Understanding CloudStack’s Physical Networking Architecture
  5. .PIG File
  6. 折腾iPhone的生活——iPhone 5s 开启 assistive touch 后卡顿的问题
  7. PHP MySQL 插入多条数据
  8. 自定义带弹性效果的pageControl
  9. this和$(this)
  10. 来一波CSS兼容问题小总结吧
  11. 统计细菌基因组ORF
  12. samba、ftp和ssh服务
  13. MySQL注入技巧性研究
  14. Bilinear CNN与 Randomly Wired Neural Network
  15. [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass
  16. Azkaban-2.5.0-部署与常见案例
  17. 【转】Java异常总结和Spring事务处理异常机制浅析
  18. python windows 下pip easy_install 使用错误的问题
  19. CrystalReports2007安装包
  20. Camtasia Studio CamStudio如何不录制鼠标

热门文章

  1. JAVA Eclipse创建的Android程序如何不显示标题栏
  2. 【Python】向函数传递列表
  3. 代理server的概要知识
  4. 强制重启Linux系统的几种方法
  5. 【BLE】CC2541之自己定义按键
  6. 把握linux内核设计思想(二):硬中断及中断处理
  7. unbuntu16.04上python开发环境搭建建议
  8. FileInputStream 的读取操作
  9. window+Jira+SQL Server
  10. StringBuilder的append、StringBuffer的append和String str = &quot;a&quot;+&quot;b&quot;的区别?