成员函数指针,传递函数作为非成员函数的参数

时间:2013-07-02 09:33:50

标签: c++ pointers member-functions

有可能做这样的事吗?不使用静态函数或使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);
}

3 个答案:

答案 0 :(得分:3)

你做不到。成员函数(未声明为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作为第一个参数。我修复了函数指针参数。

答案 1 :(得分:0)

你需要一个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));
}

答案 2 :(得分:0)

调用成员函数时,需要指定必须调用的对象。您还需要将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));
}