Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398723
  • 博文数量: 101
  • 博客积分: 2207
  • 博客等级: 大尉
  • 技术积分: 2508
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-19 20:45
文章分类

全部博文(101)

文章存档

2013年(15)

2012年(86)

我的朋友

分类: C/C++

2012-07-25 11:16:06

下面文章都转自
这两天用到了一个需要使用指针回调的地方。以前用函数指针,函数必须是静态的。对于类实例的函数指针,以前没有写过。于是查了点资料,找到了方法,但是没有boost的bind好使,不过代码较为简单,简单的满足一下应该足够了。
在这里记录一下,以后说不定有用

点击(此处)折叠或打开

  1. #include "stdafx.h"

  2. class CFunData
  3. {
  4. public:
  5.         CFunData(int nBase) {m_nBase = nBase; };
  6.         ~CFunData() {};

  7.         void Run(int nRet)
  8.         {
  9.                 printf("[Run]base(%d), All(%d) OK!\n", m_nBase, m_nBase + nRet);
  10.         }
  11. private:
  12.         int m_nBase;
  13. };

  14. class CFPoint
  15. {
  16. public:
  17.         typedef void (CFunData::*FuncP)(int);
  18.         FuncP m_FuncP;
  19.         CFunData* m_pFunData;

  20. public:
  21.         CFPoint() { m_pFunData = NULL; };
  22.         ~CFPoint() {};

  23.         bool Bind(CFunData* pFunData, FuncP pFn)
  24.         {
  25.                 m_pFunData = pFunData;
  26.                 m_FuncP = pFn;

  27.                 return true;
  28.         };

  29.         void Run(int nData)
  30.         {
  31.                 if(m_pFunData != NULL)
  32.                 {
  33.                         (m_pFunData->*m_FuncP)(nData);
  34.                 }
  35.         }
  36. };

  37. //void (CFunData::*FuncP)(int);
  38. //FuncP = &CFunData::Run;
  39. //(FunData.*FuncP)(10);

  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42.         CFunData FunData1(10);
  43.         CFunData FunData2(20);
  44.         CFPoint FPoint1;
  45.         CFPoint FPoint2;

  46.         FPoint1.Bind(&FunData1, &CFunData::Run);
  47.         FPoint1.Run(20);

  48.         FPoint2.Bind(&FunData2, &CFunData::Run);
  49.         FPoint2.Run(15);
  50.         getchar();

  51.         return 0;
  52. }

阅读(1463) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

Aquester2012-07-26 11:20:19

我经常在这个场合使用:
类似于命令字的处理,这样可能避免多级的if-else出现,而且也性能更高,扩展性也更好,在mooon中就多处使用了这个。