订阅所有文章
文章搜索

高级搜索这是社么?这是顶尖最新推出的文章增强型搜索功能!
全网 本站
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VC >> 文章正文

使用c++的成员指针实现类似Borland VCL组件的事件回调机制(下)

作者:lejakwin  来源:CSDN  点击  更新:2006-12-19 7:06:23  编辑: 画王w  字体

 进一步通用化

       上面定义的ERROR_NOTIFY_EVENT类型只适用于类B,与其他类不兼容,但是其他类有可能需要同样的             错误通知服务,所以有必要使其具备通用性,通过c++的类模版可以达到此目的,有些人可能会想到函数模        版,因为函数模版不是一种c++类型,所以无法对其进行实例化,而类模版则可以指定类型进行实例化。下        面的类模版就实现了对回调函数指针类型的封装。

 

template <class T> class CNotifyEvent

{

private:

  T* Object; 

  typedef void (T::*EVENT_TYPE)(int notify_code);    //定义成员函数指针类型

  EVENT_TYPE Method;

public:

  CNotifyEvent(T* Object,EVENT_TYPE Method)

  {

    this->Object=Object;

    this->Method=Method;

  }

 

  int DoNotify()

  {

       (Object->*Method)();  //触发回调,进行事件通知。

  } 

};

      

       下面是在VC中编写使用范例代码:

       class CSourceClass;

       class CTargetClass;

 

class CSourceClass:public Cobject //这是触发事件通知的类

{

private:

   CNotifyEvent<CTargetClass> *  m_OnNotify; //假设需要通知给CTargetClass类实例

protected:

   voidDoNotify()

   {

     if(m_OnNotify) m_OnNotify->DoNotify();       //触发事件通知

   }

public:

  CSourceClass()

  {

    m_OnNotify=NULL;

  }

 

  ~CSourceClass()

  {

      

  }

 

  //通过SetNoityEvent设置事件通知属性

  void SetNoityEvent(CNotifyEvent<CTargetClass>* event_sink)

  {

    m_OnNotify=event_sink;

  }

};

 

 

class CTargetClass:public CObject //这是需要事件通知的类

{

private:

  CNotifyEvent<CTargetClass> *m_CallBack;

protected:

  void FreeNotifyEventSink()

  {

    if(m_CallBack){

      delete m_CallBack;

      m_CallBack=NULL;

    }

  }

 

  void NewNotifyEventSink()  //创建新的事件通知类模版实例

  {

    m_CallBack=new CNotifyEvent<CTargetClass>(

               this,  //指明需要回调事件通知的对象实例

               &CTargetClass::ReceiveNotify   //指明回调事件的类成员函数类型

              );

  }

public:

  CTargetClass()

[1] [2] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •      
    热门文章  
    推荐文章  
    相关文章    
     发表评论
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备05002835号