一、采用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()的类型
尝试了一下不行,论坛里面有这样解释:为了实现回调,我们必须把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 }