• 实现类成员函数回调


    一、采用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 }
  • 相关阅读:
    上传几张智能开关产品图片
    python+ueditor+七牛云存储整合
    Shell脚本检查memcache进程并自己主动重新启动
    Cocos2dx 3.x创建Layer的步骤
    HDU 5009 Paint Pearls (动态规划)
    (转)Spring4.2.5+Hibernate4.3.11+Struts2.3.24整合开发
    (转)Spring提供的CharacterEncoding和OpenSessionInView功能
    (转)为Spring集成的Hibernate配置二级缓存
    (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二
    (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • 原文地址:https://www.cnblogs.com/quantumplan/p/3702078.html
Copyright © 2020-2023  润新知