首页 > 代码库 > 实现类成员函数回调

实现类成员函数回调

一、采用tri::function/bind方法实现类成员函数内部调用

首先声明函数类型

1 std::tr1::function<double(double)> func;

在需要调用函数的地方绑定函数

 1 switch (flgFun) {
 2 case flgSine:
 3     func = std::tr1::bind(&CAnalog::Sin, this, std::tr1::placeholders::_1);
 4     break;
 5 case flgSquare:
 6     func = std::tr1::bind(&CAnalog::Square, this, std::tr1::placeholders::_1);
 7     break;
 8 case flgRamp:
 9     func = std::tr1::bind(&CAnalog::Ramp, this, std::tr1::placeholders::_1);
10     break;
11 default:
12     break;
13 }

参考后面完整代码,需要包含头文件functional

其实刚开始就是按照自己的想法去解决问题,回过来想想能用到这种方法很可能就是自己的设计模式不够好,天天研究这种感觉山寨的方法真不如去多研究设计模式,软件框架设计是软件健壮的根本那。

二、刚开始找了一种方法是函数指针强制转换,使用方法:

1 typedef void* (*FUNC)(void*);           //定义FUNC类型是一个指向函数的指针 
2 FUNC callback = (FUNC)&MyClass::func;  //强制转换func()的类型

参考:C++中类成员函数作为回调函数

尝试了一下不行,论坛里面有这样解释:为了实现回调,我们必须把this指针给转换掉 !可为了在该函数中可以直接操作该类中的成员,我们必须保留this指针 !所 以这是矛盾的,通过转换指针的手段是不能达到 目的的 !

三、还有查到一种方法是回调代理类,感觉比较麻烦也没有尝试,这里给出链接:C++实现把非静态成员函数作为回调函数(非static)

完整代码参考

 1 enum flgFun{
 2     flgSine = 100,
 3     flgSquare,
 4     flgRamp,
 5 };
 6 CMath {
 7 double Square(double x);
 8     double Ramp(double x);
 9     double Sin(double x);
10     //求积分,flgFun为自定义函数标志,为enum型
11     double Integral(int flgFun, double a, double b, double Omg); 
12 }
13 double CMath::Integral(int flgFun, double a, double b, double Omg)
14 {
15     std::tr1::function<double(double)> func;
16     switch (flgFun) {
17         case flgSine:
18             func = std::tr1::bind(&CAnalog::Sin, this, std::tr1::placeholders::_1);
19             break;
20         case flgSquare:
21             func = std::tr1::bind(&CAnalog::Square, this, std::tr1::placeholders::_1);
22             break;
23         case flgRamp:
24             func = std::tr1::bind(&CAnalog::Ramp, this, std::tr1::placeholders::_1);
25             break;
26         default:
27             break;
28     }
29     double sum,step,result;
30     const int n = 200;                              // 统一固定积分步长为200
31     sum  = (func(Omg*a)+func(Omg*b))/2;
32     step = (b-a)/n;
33     for (int i=1;i<n;i++) {
34         sum += func((a+i*step)*Omg);
35     }
36     result = sum*step;
37     return result;
38 }