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