0

我是函数指针的菜鸟,这是我第一次使用它。

代码是:

#include "time.cpp"
int main(){
 double** matrix= new double*[10];
 for (int i=0; i<10; i++) matrix[i]=new double[10];
 gear nit;
 nit.roll(&matrix[0]);
}

时间.cpp

double pulse_a (double t, double dt);

class gear{
        void dynamics(double (*)(double, double), double** , double, double);
        double pulse_b(double t, double dt);
public:
        int net;
        void roll(double** matrix);
};

void gear::roll(double** matrix){
        double t,dt;
        double (*pfunc)(double,double)=pulse_a; //or pulse_b
        dynamics(pfunc,&matrix[0],t,dt);
}

void gear::dynamics(double (*pulse)(double , double ), double** matrix, double t, double dt){

pulse(t,dt);
}

当我将 pfunc 分配给 pulse_a 时,我得到

错误:'double (gear::)(double, double)' 类型的参数不匹配 'double (*)(double, double)'</p>

为了 double (*pfunc)(double,double)=pulse_a;

当我将 pfunc 分配给 pulse_b 时,我得到undefined reference to chirp(double, double)'double (*pfunc)(double,double)=pulse_b;

我究竟做错了什么?

4

2 回答 2

3

您选择了一个非常复杂的示例来首次涉足函数指针。你应该从你能想到的最简单的例子开始。

你的第一个指针

double (*pfunc)(double,double)=pulse_a;

按书面方式工作。它不会产生您描述的错误;我看不出它如何可能产生您描述的错误(因为它不涉及gear),所以我敢打赌您发布的代码不是产生错误的代码。请不要那样做。

指向函数的指针和指向成员函数的指针是不同的动物。它们有不同的类型,不可互换。不要试图将一个人投给另一个人,否则您将违反古代部落法律(并且您将获得未定义的行为)。

void dynamics2(double (gear::*)(double, double), double** , double, double);
...
double (gear::*pfunc2)(double,double) = &gear::pulse_b;
dynamics2(pfunc2,&matrix[0],t,dt);

一旦掌握了这些提示,您就可以通过以下方式省去一些麻烦typedef

typedef double (gear::*gearMemFn)(double, double);
void dynamics2(gearMemFn, double** , double, double);
...
gearMemFn pfunc2=&gear::pulse_b;
于 2012-10-21T15:44:43.727 回答
0

不要将函数指针用于任何事情。std::function像正常人一样使用。

此外,成员函数不是也永远不可能是函数指针。它必须是一个静态函数。

于 2012-10-21T14:45:40.533 回答