• 帮助
    • 博客
    • 相册
    • 网盘
    • 超市
    • Xer吧
  • 登录
  • 注册
【公告】关于近期部分用户收到虚假中奖提示的通告    【公告】关于网站取消无线业务的通告    【公告】个人空间首页新增“我的专辑”版块    【公告】X5dj广告过滤系统上线    【公告】新功能“我的专辑”上线,珍藏属于你的美好回忆    【公告】X5dj网站网络硬盘用户使用协议    【公告】X5dj新功能汇总贴:新增“密码目录”功能上线    【公告】X5dj.com相册/网盘上传工具发布    
  • hitsuns的个人空间
  • http://www.x5dj.com/hitsuns 复制地址
  • 首页

  • 博客

  • 相册

  • 网盘

  • 人际关系网

  • 我的专辑

loading...
XP中如何限制“我最近的文档” < 上一篇 下一篇 > 万能型电视遥控器代码表
成员函数的指针与全局函数转换
hitsuns 发表于: 2007-02-28 10:24 来源:转载  X度:0  浏览:(362)  评论:(0)
收藏 | 复制地址 | [举报此文章] |  大 中 小 |  引用 删除 修改
   
      指向成员函数的指针并非指针,是一个类内偏移加1  
      non-static函数,不能用作回调函数,因为函数的第一个参数是隐含的this指针,所以与回调类型不匹配了。   
    
           再加一个m_pthis指针上去,用于保存所指对象,这样就可以避免你所说的单一的static了。不过,要使用具体哪个对象的回调函数前,必须reset()一下static的那个指针值:),当然也可以把reset()放在构造函数里。  
   
  修改过的代码如下:  
  //   DosTest.cpp   :   Defines   the   entry   point   for   the   console   application.  
  //  
   
  #include   "stdafx.h"  
   
  #include   <iostream>  
  using   namespace   std;  
   
  typedef   void(   *CFUNC   )(   int,int   );  
  void   DoSomeThing(   CFUNC   pFunc   ){  
      pFunc(   10,   20   );  
  }  
   
   
  class   CMyClass{  
  public:  
      void   DoThing(   int   i,int   j   ){   cout<<   i   <<'   '<<   j<<endl;   }  
  };  
   
  //   CallBack   of   CMyClass   的封装。  
  class   cb_CMyClass{  
      typedef   void   (   CMyClass::*   C_MFUNC   )(   int,   int   );  
      static   CMyClass*   pthis;  
      static   C_MFUNC       pfunc;  
      //   回调函数。   用当前注册的   pthis   调用   当前注册的   pfunc  
      static   void   cb_func(   int   i,   int   j   )   {  
          if   (   pthis   &&   pfunc   )   (   pthis->*pfunc   )(   i,   j   );  
      }  
  public:  
      //   get_CallBack,   设置属性并返回回调函数。  
      //   缺点是,属性保存为全局变量,一次只能设置一个回调函数  
      static   CFUNC   getCB(   C_MFUNC   pf   )   {  
          pfunc   =   pf;  
          return   cb_func;  
      }  
      //----------------------------------------------  
  public:  
      explicit   cb_CMyClass(CMyClass&   pt):m_pthis(&pt)   {}  
      void   reset()   {   pthis   =   m_pthis;   }  
  private:  
        CMyClass*   m_pthis;  
  };  
   
  CMyClass*   cb_CMyClass::pthis;  
  cb_CMyClass::C_MFUNC   cb_CMyClass::pfunc;  
   
   
  int   main(){  
      CMyClass   c;  
      //   cb_CMyClass::getCB   返回一个回调函数指针。  
      //   他的参数是:设置当前   CMyClass   对象,以及需要回调的函数  
      //   但是:注意!   他们都是static成员。   所以这两个数据只有一套!  
      //   下次使用就会覆盖上次   this   和   func   设置!  
      /*   modified   by   igray  
        *   添加了一个成员变量来保存对象状态和reset()函数来重置static的pthis  
        */  
      cb_CMyClass   cb_wrapper(c);  
      cb_wrapper.reset();  
      DoSomeThing(   cb_CMyClass::getCB(   &CMyClass::DoThing   )   );  
  }  
 
系统分类:
推送: IT·互联网 IT原创   IT·互联网 应用·管理    归类:资料知识

 
XP中如何限制“我最近的文档” < 上一篇 下一篇 > 万能型电视遥控器代码表
用户回复
首页 上一页 1 下一页 尾页 共 1 页
评分与快速回复

博主推荐
相关文章
博友热推
  • 拥有一颗积极的心,才能活出尊严
  • 珍惜身边每一个垂手可得的小幸福
  • 每个人心里都藏着一种神奇的东西
  • 为了一套房子,要奋斗多少年才行
  • 不结婚就不能为自己买戒指了吗?
  • 开始有点世故,看不起人品差的人
  • 不主动惹阎王也免不了被小鬼缠上
  • 失败给我带来的是万劫不复的恐惧
  • 原来美丽,就是混着血和泪的痛苦
  • 还是继续在不知不觉中继续习惯吧
关于我们 | X5dj动态 | 加入我们 | 友情链接 | 官方日志 | 免责声明 | 举报不良信息
北京开创明天科技有限公司 版权所有 京ICP证040979号