2013-07-02 2 views
0

이렇게 할 수 있습니까? 정적 함수를 사용하지 않거나 chordL의 구성원을 power으로 지정하십시오. 나는 그것을하는 법을 정말로 이해하지 못한다. 가능하지 않을 수 있겠는가?멤버 함수 포인터, 비 멤버 함수의 argoument로 함수 전달

class power { 
    double b;  

public: 
    void set(double par){b=par}  

    double fun(double arg){ 
    return b*pow(arg,2); 
    } 

    double execute(double par1, double par2); 
}; 

double chordL(power::*fm, double p1, double p2){  // it's not a member function 
    return sqrt(pow(fm(p1)-fm(p2),2)+pow(p1-p2,2)); // clearly doesn't work! 
} 

double power::execute(double par1, double par2){  // it's a member function 
    double (power::*g)(double); 
    g=&power::fun; 
    return chordL(g,par1,par2); 
} 

답변

3

당신은 할 수 없습니다. static으로 선언되지 않은 멤버 함수는 특수/숨김 인수가 this입니다. 올바른 형식의 개체가있는 경우, 당신은 기능과 함께 그것을 통과하고, 멤버 함수에 필요한 모호한 구문을 호출하여 호출 할 수 있습니다 :

double chordL(power* tp, double (power::*fm)(double), double p1, double p2) 
... 
    (tp->*fm)(p1); 


double power::execute(double par1, double par2){  // it's a member function 
    double (power::*g)(double); 
    g=&power::fun; 
    return chordL(this, g,par1,par2); 
} 

편집 : chordL에 this를 전달하는 코드를 호출 추가 함수를 호출하고 객체의 순서와 함수 포인터를 이전 게시물에서 바꾼 경우 this을 첫 번째 인수로 전달하는 것이 좋습니다. 그리고 함수 포인터 인수를 수정했습니다.

+0

좋아! 그래서 클래스 포인터 인 tp를 전달해야합니다. 하지만 함수 execute에서 이것을 어떻게 할 수 있습니까? 왜냐하면 나는 힘의 일원 인 실행에서 chordL을 사용하고 싶다. –

+0

'T ::'는'power'를 가리키고 있습니까? 그렇다면 chordL에'this '를 전달해야합니다. –

+0

예, 죄송합니다. 'this '를 전달하는 법? 어떻게 함수를 실행할 수 있습니까? 그것이 내가 이해하지 못하는 요점이다! –

0

는이 같은 함수 포인터에 전화를 power의 인스턴스가 필요합니다

double chordL(T& instance, T::*fm, double p1, double p2){ 
    return sqrt(pow(instance.*fm(p1) - instance.*fm(p2), 2) + pow(p1 - p2, 2)); 
} 
0

멤버 함수를 호출 할 때 호출해야하는 객체를 지정해야합니다. 이 같은 기능을뿐만 아니라 chordLthis 포인터를 전달하고, 호출 할 필요가 :

template<class T> 
double chordL(T* t, double (T::*fn)(double), double p1, double p2) 
{ 
    return sqrt(pow((t->*fn)(p1) - (t->*fn)(p2), 2) + pow(p1 - p2, 2)); 
}