2012-10-21 5 views
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]); 
} 

time.cpp 내가 pulse_a에 pfunc를 할당 할 때 내가 assing 때

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

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

에 대한

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

를 얻을 수 피 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을 포함하지 않기 때문에)를 어떻게 생성 할 수 있는지 보지 못하기 때문에 게시 한 코드가 오류를 생성 한 코드가 아닐 것입니다. 제발 그만 하지마.

멤버 함수 포인터은 다른 동물입니다. 그들은 서로 다른 유형을 가지고 있으며 상호 교환 할 수 없습니다. 서로를 던지려고 시도하지 마십시오. 그렇지 않으면 고대 부족의 법을 위반하게됩니다. 그리고 당신은 정의되지 않은 행동을 취할 것입니다. 당신이이 포인터의 요령을 입수하면

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 :에서 'pulse_a (double, double)'에 대한 정의되지 않은 참조 collect2 : ld가 1을 반환했습니다. 종료 상태 I ' m 사용, g ++ 버전 4.5.1 20101208 (수세 리눅스) –

+0

세부 사항에 대해 설명해 주셔서 감사합니다. 멤버 함수들에 대해서. 그것은 그 일을 해결합니다. –

+0

괜찮습니다. 나는 방금 정의하지 않은 함수를 선언했다. 내 잘못이야. –