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

转载于:https://www.cnblogs.com/xkzy/p/3958017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值