0

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

3 回答 3

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);
}

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

于 2013-07-02T09:45:30.067 回答
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));
}
于 2013-07-02T09:46:40.917 回答
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));
}
于 2013-07-02T09:44:31.677 回答