现在想想,我玩C++还真是处于没入门的阶段呢,函数指针跟指针函数貌似是挺好用的东西,抱着实用主义的思想一直没的好好研究过。当然,也不能自大到丁点也没研究过的地步,其实在类内部的函数指针的使用没太大的困难,这在网上Google一下就可以得到很多详细的说明,但跨类来使用函数指针还真不好找,在此推荐一篇好文章:http://www.vckbase.com/index.php/wv/1514能将此文看懂,估计关于函数指针都可以有个大概的了解了。
再说说自己弄的一个例子。因为最近在重整一个基于DC绘画的程序界面(原生MFC的东西太难看了,尤其是在CE下面的,有点类似嵌入式系统的深入定制),然后就虚拟了一大堆自己定义的按钮类窗口类什么的,为了将更多的细节封装起来,于是就用函数指针对进行函数的响应。主要有两个类:CMyForm跟CMyButton,Button点击后就响应CMyForm里的一个回调函数OnButtonClicked(void),直接上代码比较方便说明。
- //获取类成员函数的地址值
- //使用union来寻找函数的地址
- template<typename TFuncAddr,typename TFunc>
- void GetMemberFuncAddr(TFuncAddr& addr, TFunc func)
- {
- union
- {
- TFunc _func;
- TFuncAddr _addr;
- }ut;
- ut._func = func;
- addr = ut._addr;
- }
- //void (*function)(void) 类型的函数指针,此处没有带入参
- typedef void (__stdcall * FUNCTION_CALLBACK)(void);
- //按钮类
- class CMyButton
- {
- public:
- //函数指针
- FUNCTION_CALLBACK FunctionButtonClicked;
- //按钮构造函数
- CMyButton(void)
- {
- }
- //添加鼠标UpEvent事件的回调函数
- //使用模板类是方便广泛适应不同的窗体类
- //类成员函数指针的传递比类内部的传递要麻烦得多
- template<typename TFunc>
- void AddMouseClickedEvent(TFunc func)
- {
- DWORD dwAddr = 0;
- GetMemberFuncAddr(dwAddr, func);
- this->FunctionButtonClicked = (FUNCTION_CALLBACK)dwAddr;
- }
- //调动回调函数
- void OnButtonClickEvent(void)
- {
- this->FunctionButtonClicked();
- }
- };
- //窗体类
- class CMyForm
- {
- public:
- //按钮实例
- CMyButton * pButton;
- //构造函数
- CMyForm(void)
- {
- }
- //在此创建按钮及其他自定义控件
- void Init(void)
- {
- this->pButton = new CMyButton();
- pButton->AddMouseClickedEvent(&CMyForm::OnButtonClicked);
- }
- //按钮点击后需要执行的函数
- void OnButtonClicked(void)
- {
- //实现内容
- //.......
- }
- };
当CMyForm类实现后,在不用再修改用CMyButton里的内容,封装好后看起来极像AS的标准用法。此处用到了模板函数的概念,有时相当方便未知类型参数的传递,请注意,我这里的只用到了一个函数指针,即void(*func)(void),若需要带参数传入的则请好好参考上文我提供的那篇前辈写的文章,我之所以写下此文,纯粹是为了自己备忘而已。
此方法暂时可以完美实现函数指针的赋值与使用,但还不算经严格验证,若有需要我就再补充吧。另外提一下,最标准的类成员函数的传递是使用模板类,如果对CMyButton的操作不多完全可以使用模板类来传递指针,但由于我个人对CMyButton的操作奇复杂,就放弃了。