2

So, I have a function, called Romberg, that takes a function as first parameter:

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

When executed, it applies the passed function to several values.

In a class, I have defined the following methods:

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

Where fd is another method from the same class. This however, doesn't work! I tried altering the code in the following way, which ends up with successfully passing the method to the Romberg function; but then it fails to apply the passed function:

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

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

I get the following error message:

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

Right now, I do not see how to make this work without throwing away the whole class system I built.

4

2 回答 2

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, ... );
};
于 2013-05-27T17:13:46.180 回答
1

为了使它与您的类系统一起工作,您需要定义fd一个指向成员函数的指针而不是指向函数的指针(两者相同)。

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

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

于 2013-05-27T16:56:16.770 回答