zoukankan      html  css  js  c++  java
  • 实现类成员函数回调

    一、采用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 }
  • 相关阅读:
    .NET文件格式相关开源项目
    ASP.NET配置文件Web.config 详细解释
    Allow user to select camera or gallery for image
    android之调用webservice 实现图片上传
    使用 iTextSharp 生成 PDF 表格
    Android:如何显示网络图片
    Android的HttpClient和WebView session不同的问题
    提高你开发效率的十五个Visual Studio 2010使用技巧
    HTML5 Audio/Video 标签,属性,方法,事件汇总
    ASP.NET Web 项目文件类型
  • 原文地址:https://www.cnblogs.com/quantumplan/p/3702078.html
Copyright © 2011-2022 走看看