【问题标题】:Member function pointer, pass function as argoument of a non member function成员函数指针,将函数作为非成员函数的参数传递
【发布时间】:2013-06-29 14:46:55
【问题描述】:

有可能做这样的事情吗?不使用静态函数或使chordL 成为power 的成员。我真的不明白该怎么做,这不可能吗?

class power {
  double b;     

public:
  void set(double par){b=par}     

  double fun(double arg){
    return b*pow(arg,2); 
  } 

  double execute(double par1, double par2);
};

double chordL(power::*fm, double p1, double p2){      // it's not a member function
  return sqrt(pow(fm(p1)-fm(p2),2)+pow(p1-p2,2));  // clearly doesn't work! 
}

double power::execute(double par1, double par2){     // it's a member function
  double (power::*g)(double);
  g=&power::fun;
  return chordL(g,par1,par2);
}

【问题讨论】:

    标签: c++ pointers member-functions


    【解决方案1】:

    你不能那样做。成员函数(未声明为static)有一个特殊/隐藏参数this。如果你有一个正确类型的对象,你可以将它与函数一起传递,并使用成员函数调用所需的晦涩语法来调用它:

     double chordL(power* tp, double (power::*fm)(double), double p1, double p2)
     ...
         (tp->*fm)(p1); 
    
    
    double power::execute(double par1, double par2){     // it's a member function
      double (power::*g)(double);
      g=&power::fun;
      return chordL(this, g,par1,par2);
    }
    

    编辑:添加调用代码,将 this 传递给 chordL 函数,并交换上一篇文章中对象和函数指针的顺序 - 将 this 作为第一个参数传递更有意义。我修复了函数指针参数。

    【讨论】:

    • 好的!所以我必须通过 tp 这是一个类指针。但是我怎样才能在函数执行中做到这一点?因为我想在执行中使用 chordL,它是权力的一员!
    • T:: 应该指代power 吗?如果是这样,您需要将 this 传递给 chordL。
    • 是的,对不起!如何通过this?它怎么可能是执行功能?这就是我不明白的点!
    【解决方案2】:

    您需要一个 power 的实例来调用函数指针,如下所示:

    double chordL(T& instance, T::*fm, double p1, double p2){
        return sqrt(pow(instance.*fm(p1) - instance.*fm(p2), 2) + pow(p1 - p2, 2));
    }
    

    【讨论】:

      【解决方案3】:

      调用成员函数时,需要指定要调用它的对象。您还需要将this 指针传递给chordL,并像这样调用函数:

      template<class T>
      double chordL(T* t, double (T::*fn)(double), double p1, double p2)
      {
          return sqrt(pow((t->*fn)(p1) - (t->*fn)(p2), 2) + pow(p1 - p2, 2));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-17
        • 2018-04-14
        • 1970-01-01
        • 2018-09-18
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多