2012-10-21 46 views
0

我是函数指针的noob,这是我第一次使用它。函数指针 - 类内外

的代码是:

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

time.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,我得到

error: argument of type ‘double (gear::)(double, double)’ does not match ‘double (*)(double, double)’

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

当我assing p func到pulse_b,我得到undefined reference to chirp(double, double)' 对于double (*pfunc)(double,double)=pulse_b;

我在做什么错?

回答

0

不要对任何东西使用函数指针。像普通人一样使用std::function

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

2

你选择了一个可笑的复杂的例子,你第一次进入函数指针。你应该从最简单的例子开始。

你的第一个指针书面

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

作品。它不会产生你描述的错误;我没有看到它可能会产生你描述的错误(因为它不涉及gear),所以我敢打赌你发布的代码不是产生错误的代码。请不要这样做。

A 函数指针指向成员函数的指针是不同的动物。他们有不同的类型,不可互换。不要试图相互转换,否则你会违反古代的部落法(你会得到未定义的行为)。

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; 
+0

这是确切的错误: /tmp/ccy2DvIL.o:在函数'gear :: roll(double **)': /home/user/dir/time.cpp:13:未定义的引用'pulse_a(double,double)' collect2:ld返回1退出状态 I' m使用,g ++版本4.5.1 20101208(SUSE Linux) –

+0

感谢您解释有关细节关于成员职能。它解决了这个问题。 –

+0

没关系。我刚刚宣布了这个功能,没有定义它。我的错。 –