现在想想,我玩C++还真是处于没入门的阶段呢,函数指针跟指针函数貌似是挺好用的东西,抱着实用主义的思想一直没的好好研究过。当然,也不能自大到丁点也没研究过的地步,其实在类内部的函数指针的使用没太大的困难,这在网上Google一下就可以得到很多详细的说明,但跨类来使用函数指针还真不好找,在此推荐一篇好文章:http://www.vckbase.com/index.php/wv/1514能将此文看懂,估计关于函数指针都可以有个大概的了解了。

再说说自己弄的一个例子。因为最近在重整一个基于DC绘画的程序界面(原生MFC的东西太难看了,尤其是在CE下面的,有点类似嵌入式系统的深入定制),然后就虚拟了一大堆自己定义的按钮类窗口类什么的,为了将更多的细节封装起来,于是就用函数指针对进行函数的响应。主要有两个类:CMyForm跟CMyButton,Button点击后就响应CMyForm里的一个回调函数OnButtonClicked(void),直接上代码比较方便说明。

  1. //获取类成员函数的地址值 
  2. //使用union来寻找函数的地址 
  3. template<typename TFuncAddr,typename TFunc> 
  4. void GetMemberFuncAddr(TFuncAddr& addr, TFunc func) 
  5.     union 
  6.     { 
  7.         TFunc _func; 
  8.         TFuncAddr _addr; 
  9.     }ut; 
  10.     ut._func = func; 
  11.     addr = ut._addr; 
  12.  
  13. //void (*function)(void) 类型的函数指针,此处没有带入参 
  14. typedef void (__stdcall * FUNCTION_CALLBACK)(void); 
  15.  
  16.  
  17. //按钮类 
  18. class CMyButton 
  19. public
  20.  
  21.     //函数指针 
  22.     FUNCTION_CALLBACK FunctionButtonClicked; 
  23.  
  24.     //按钮构造函数 
  25.     CMyButton(void
  26.     { 
  27.  
  28.     } 
  29.  
  30.     //添加鼠标UpEvent事件的回调函数 
  31.     //使用模板类是方便广泛适应不同的窗体类 
  32.     //类成员函数指针的传递比类内部的传递要麻烦得多 
  33.     template<typename TFunc> 
  34.     void AddMouseClickedEvent(TFunc func) 
  35.     { 
  36.         DWORD dwAddr = 0; 
  37.         GetMemberFuncAddr(dwAddr, func); 
  38.         this->FunctionButtonClicked = (FUNCTION_CALLBACK)dwAddr; 
  39.     } 
  40.  
  41.     //调动回调函数 
  42.     void OnButtonClickEvent(void
  43.     { 
  44.         this->FunctionButtonClicked(); 
  45.     } 
  46. }; 
  47.  
  48. //窗体类 
  49. class CMyForm 
  50. public
  51.  
  52.     //按钮实例 
  53.     CMyButton * pButton; 
  54.      
  55.     //构造函数 
  56.     CMyForm(void
  57.     { 
  58.  
  59.     } 
  60.  
  61.     //在此创建按钮及其他自定义控件 
  62.     void Init(void
  63.     { 
  64.         this->pButton = new CMyButton(); 
  65.         pButton->AddMouseClickedEvent(&CMyForm::OnButtonClicked); 
  66.     } 
  67.  
  68.     //按钮点击后需要执行的函数 
  69.     void OnButtonClicked(void
  70.     { 
  71.         //实现内容 
  72.         //....... 
  73.     } 
  74. }; 

当CMyForm类实现后,在不用再修改用CMyButton里的内容,封装好后看起来极像AS的标准用法。此处用到了模板函数的概念,有时相当方便未知类型参数的传递,请注意,我这里的只用到了一个函数指针,即void(*func)(void),若需要带参数传入的则请好好参考上文我提供的那篇前辈写的文章,我之所以写下此文,纯粹是为了自己备忘而已。

此方法暂时可以完美实现函数指针的赋值与使用,但还不算经严格验证,若有需要我就再补充吧。另外提一下,最标准的类成员函数的传递是使用模板类,如果对CMyButton的操作不多完全可以使用模板类来传递指针,但由于我个人对CMyButton的操作奇复杂,就放弃了。