2013-07-02 4 views
0

Можно ли сделать что-то вроде этого? Без использования статических функций или сделать chordL членом power. Я действительно не понимаю, как это сделать, разве это невозможно?Функция указателя функции, функция пропуска в качестве аргумента функции нечлена

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

Edit: добавлено вызывающий код, передавая this к chordL функции и поменял порядок объекта и указатель на функцию из предыдущего сообщения - имеет смысл передать this в качестве первого аргумента. И я исправил аргумент указателя функции.

+0

Ok! Поэтому я должен передать tp, который является указателем класса. Но как я могу это сделать в выполнении функции? Потому что я хочу использовать chordL в исполнении, который является членом власти! –

+0

Предполагается, что 'T ::' относится к 'power'? Если это так, вам нужно передать 'this' вместе с chordL. –

+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

При вызове функции-члена вам необходимо указать объект, на который он должен быть вызван. Вам необходимо пройти this указатель на chordL, а также и вызвать функцию следующим образом:

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