2012-10-21 47 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

沒關係。我剛剛宣佈了這個功能,沒有定義它。我的錯。 –