2013-07-02 71 views
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); 
} 

回答

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作为第一个参数传递。我修正了函数指针参数。

+0

好!所以我必须通过tp这是一个类指针。但我怎么能在执行函数中做到这一点?因为我想在执行中使用chordL,这是一个权力的成员! –

+0

'T ::'是否应该指'power'?如果是这样,你需要将'this'一起传递给chordL。 –

+0

是的,对不起!如何通过'this'?它怎么可能是执行功能?这是我不明白的地方! –

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