1.回调函数的说明: 在进行软件开发的过程中,常会用到一些声明为CALLBACK的函数,这些函数就是回调函数。使用 回调函数可以改善软件的结构、提高软件的复用性。比如,在一个规模较大的软件项目中,可以将一些资 源或相对独立的处理模块封装到动态连接库(DLL) 中,然后通过回调函数在不同的场合来使用这些资源 和模块。利用回调函数还可以进行程序间复杂的通信,实现一些通知的功能,在某些场合它是比消息更 合适的一种方式;在一些特殊的情况下,回调函数更有不可替代的作用。Win32 API 中有许多回调函数的 应用,在进行软件设计时也会经常用到这种函数,而有些时候则需要编写自己的回调函数。因此,理解回 调函数的原理并掌握它的基本用法是非常必要的。 C ++ 是当代使用最广泛的语言,从嵌入式系统到大型机系统、从LINUX 到WINDOWS ,在大型系统的 编制中,到处都是它的身影。它以高效和易编程性获得了许多资深程序员的信赖。在DirectX Play 开发过 程中,经常需要使用到回调函数,直接使用回调函数显得复杂麻烦,采用用C + + 实现对回调函数的封装, 使回调函数变得方便实用,对于DirectX Play 等编程就显得是非常有意义的。 回调函数简单讲就是一个函数指针。写一个函数,然后把函数地址传递给这个函数指针就可以了。 回调函数的原形对C ++ 的成员函数用做回调函数的影响是什么/span> 编写回调函数简单地说就是函数原形一致。函数的输入参数,输出参数一致是很容易保证的。要注 意调用类型一致性。函数传参数有好几种类型,搞错了传参数的方式,系统必然运行错误。一般来说都 是WINAPI 传参数方式。要注意C ++ 的类的成员函数和一般的C 函数的区别。C + + 类采用this 规则传 递函数。在使用类的成员函数作为回调函数,要求该成员函数被声名为静态成员函数,并且注意函数声 名的时候要同时声明好参数传递规则。 2.我的回调函数的理解, 模块A ,模块B, 如果模块B 中调用模块A 的东西, 在模块A中发生一个事件或操作,调用B的函数处理, 这就才用了回调函数的机制。
3.例子的实现 模块A的代码 #ifndef __A_H #define __A_H class A { public: A(void){} public: ~A(void){} typedef void (*perfect)(int ); //声明回调函数 public: voidCallBackFunc(void (*perfect)(int ),int n) //给模块B调用的函数 { perfect(n); //调用的函数 } }; #endif //__A_H
模块B的代码 #include <iostream> #include “A.h”using namespace std;void perfect(int n) //这个函数要求是全局的,或者是类中的静态成员变量{ cout<<n<<endl;}int main(){ A a; a.CallBackFunc(perfect,100); //调用模块A的代码。 return 0;}
静态成员函数调用非静态成员函数 应用于回调函数 代码如下 模块A的代码 #ifndef __CALLBACKTEST_H #define __CALLBACKTEST_H
class CallBackTest { public: CallBackTest(void); public: ~CallBackTest(void); typedef void (*perfect)(void*,int ); //声明回调函数 public: voidCallBackFunc(void* pThisOBject,void (*perfect)(void*,int ),int n) { p=perfect; m_n=n; m_pThisObject=pThisOBject; }
void ExecBackFunc() { p(m_pThisObject,m_n); }
private: perfect p; int m_n; void* m_pThisObject; }; #endif //__CALLBACKTEST_H
模块B的代码 #include <iostream> #include “CallBackTest.h” using namespace std; class testMai { public: static void perfect(void *pdata,int n) { testMai* pObject=(testMai*)pdata; pObject->test(n); }
void Exec() { CallBackTest callbackTest; callbackTest.CallBackFunc(&this,perfect,100); cout<<“ni hao”<<endl; callbackTest.ExecBackFunc(); }
void test(int n) { int i=1; int count=0; m=9; for(i=1;i<n;i++) { if(0==n%i) { count+=i; } } if(count==n) //printf(“%d是完数n”,n); { cout<<n<<“是完数”<<endl; } else { cout<<n<<“bu shi de “<<endl; } }
private: int m;
};
int main() { testMai testMai; testMai.Exec(); return 0; }
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!