在C ++中,如何将对象的方法作为参数传递给函数?

时间:2013-05-27 16:51:13

标签: c++ function methods parameters

所以,我有一个名为Romberg的函数,它将函数作为第一个参数:

int Romberg(double (*f)(double), ... );

执行时,它将传递的函数应用于多个值。

在课堂上,我定义了以下方法:

double Funktion::q(double x){
    return(sqrt(1.0+fd(x)*fd(x)));
};
void Funktion::compute_bogen(){
    Romberg(q, ... );
};

fd是来自同一个类的另一个方法。但是,这不起作用!我试着用以下方式改变代码,最终成功地将方法传递给Romberg函数;但是它无法应用传递的函数:

int Romberg(double (Funktion::* &f)(double), ... );

void Funktion::compute_bogen(){
    Romberg(&Funktion::q, ... );
};

我收到以下错误消息:

error C2064: term does not evaluate to a function taking 1 arguments

现在,我没有看到如何在不丢弃我构建的整个类系统的情况下完成这项工作。

2 个答案:

答案 0 :(得分:2)

  

我收到以下错误消息:

     
    

错误C2064:术语不评估为采用1个参数的函数

  

这是因为Funktion::q秘密地接受了2个参数,this指针和double

问题是Romberg没有关于在Funktion::compute_bogen()中调用它的对象的任何信息,因此无法将其提供给Funktion::q()。你可能想要这样的东西:

typedef double (Funktion::*RombergFuncArg)(double)

int
Romberg(RombergFuncArg func, Funktion& obj, ... )
{
   double input  = 0.0;
   double output = (obj.*func)(input);
   //...
}

[编辑]回复评论:

void Funktion::compute_bogen(){
   Romberg(&Funktion::q, *this, ... );
};

答案 1 :(得分:1)

要使它与您的类系统一起使用,您需要定义fd以获取指向成员函数的指针而不是指向函数的指针(两者相同)。

然后你需要为指向成员函数的指针正确调用它(这与调用指向函数的指针略有不同)。

我注意到虽然你可以做到这一点,但考虑到一些不同的结构你可能会更好。一个相当常见的是使用虚函数,您将在各种派生类中覆盖它。然后,不是使用指向成员函数的指针,而是选择实现所需函数的对象,并调用该对象中的虚函数。