zoukankan      html  css  js  c++  java
  • 使用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 ",n);
     }
    private:
     CForm Form;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
     CWindows Windows;
     Windows.Run();
     Windows.RemoveEvent();
     Windows.Run();
     return 0;
    }

  • 相关阅读:
    git 学习笔记
    review一下上一年的积累
    修改数据库用户的IP地址
    phpstudy 设置局域网内访问本地项目
    关于layui的时间空间 点击时间直接确定并关闭窗口
    关于tp5.1隐藏入口文件出现No input file specified.的解决办法
    关于在TP中使用webupload切片上传文件与CI框架中切片上传文件
    关于使用微信浏览网页打开键盘会把网页顶上去,是弹窗无法相应的问题解决
    VUE的安装及使用(待续)
    前端实现调动打印机部分打印界面
  • 原文地址:https://www.cnblogs.com/xkzy/p/3958017.html
Copyright © 2011-2022 走看看