回调函数这个东西使用得比较多,其实所谓的回调函数就是函数指针,但在面向对象编程中,往往我们会使用他们达到很巧的目的,比如说类的封装中;或者用得更多的是实现动态绑定;呵呵这不是C++中传说的多态吗,
先来个简单的介绍函数指针:
Copy code
#include<iostream> typedef int(*callback)(int); using namespace std; class X { protected: int xx; public: X() { xx=11; // hh=22; } static int get_hh(int a) { cout<<\"函数get_hh\"<<endl; return a; } }; class Y { private: int xx; X X_class; callback lp; public: Y() { xx=7; } int hehe(callback lp) { lp(xx); return xx; } void xixi() { lp=&X::get_hh; } }; int f_xx(int a) { cout<<\"这是全局函数f_xx:\"<<a<<endl; return a; } int main(int argc,char *argv[],char env[]) { int xx; callback lp; xx=111; cout<<\"呵呵!!\"<<endl; cout<<\"第一步:函数指针\"<<endl<<\"---------------------------------------------------------\"<<endl; lp=&X::get_hh; cout<<\"这就是函数指针直接调类中的静态成员函数get_xx:\"<<endl; cout<<lp(xx)<<endl; lp=&f_xx; cout<<\"这就是函数指针直接全局函数f_xx:\"<<lp(xx)<<endl; cout<<\"第二步:跨类回调\"<<endl<<\"---------------------------------------------------------\"<<endl; Y Y_class; lp=&X::get_hh; cout<<\"这就是在Y类中调用了X类中的方法\"<<endl; cout<<Y_class.hehe(lp)<<endl; cin>>xx; return 0; } |
主要需要注意的是在使用函数指针的时候,如果指向的函数是在某个类中,则该函数必须是静态成员函数
还有函数指针的申明格式,怪怪的哈,呵呵用多了就不觉得了 ,接下来我们用它来干点面向对象因该干的事情:
Copy code
include<iostream> using namespace std; typedef int(*callback)(int); class X { public: int X_test(callback lp,int a) { a--; cout<<\"执行回调函数的之前,传入参数变成:\"<<endl; cout<<a<<endl; a=lp(a); cout<<\"执行回调函数的之后,传入参数变成:\"<<endl; cout<<a<<endl; return a; } }; class Y { protected: int xx; private : X X_class; callback lp; public: Y(int a) { xx=a; } static int hehe(int a) { for(int i=1;i<=10;i++) { a++; } return a; } void xixi() { X c_x; lp=&hehe; xx=c_x.X_test(lp,xx); cout<<\"最终结果传到Y类中的xx变成了:\"<<endl; cout<<xx<<endl; } }; int main(int argc,char *argv[],char env[]) [Page] { int xx; Y *y_c=new Y(100); y_c->xixi(); return 0; }
|
这样在X类中使用了Y类中的方法,现在我们的X类只是做加法,而减法放在了Y类中。当然这个只是为了便于理解才简化的,只是一个类比,比如一个类实现数据处理而另外一个实现视图处理。是不是??