2013-05-27 2 views
2

Итак, у меня есть функция, которая называется Ромберга, которая принимает функцию в качестве первого параметра:В C++, как вы можете передать метод объекта в качестве параметра функции?

int Romberg(double (*f)(double), ...); 

При выполнении, он применяет переданную функцию к нескольким значениям.

В классе, я определил следующие методы:

double Funktion::q(double x){ 
    return(sqrt(1.0+fd(x)*fd(x))); 
}; 
void Funktion::compute_bogen(){ 
    Romberg(q, ...); 
}; 

Где fd это еще один метод из того же класса. Это, однако, не работает! Я попытался изменить код следующим образом, который заканчивается успешным передачей метода функции Ромберга; но тогда он не применять переданную функцию:

int Romberg(double (Funktion::* &f)(double), ...); 

void Funktion::compute_bogen(){ 
    Romberg(&Funktion::q, ...); 
}; 

Я получаю следующее сообщение об ошибке:

error C2064: term does not evaluate to a function taking 1 arguments 

Прямо сейчас, я не вижу, как сделать эту работу, не выбрасывая всю систему класса Я построил.

+0

Проблема заключается в том, что вы должны передать экземпляр для вызова его. http://blog.slaks.net/2011/06/delegates-vs-function-pointers-part-2-c.html/ – SLaks

+0

Вы пытались использовать Romberg как функцию друга? –

+0

Можете ли вы сделать свою функцию 'f' статической или свободной функцией? – Andrei

ответ

2

Я получаю следующее сообщение об ошибке:

ошибка C2064: термин не вычисляться в функции принимает 1 аргументы

Это происходит потому, что Funktion::q тайно принимает 2 аргумента, this указатель и double

Проблема в том, что Romberg не имеет информации об объекте, который называет его Funktion::compute_bogen(), поэтому он не может дать его Funktion::q(). Вы, наверное, хотите что-то вроде этого:

typedef double (Funktion::*RombergFuncArg)(double) 

int 
Romberg(RombergFuncArg func, Funktion& obj, ...) 
{ 
    double input = 0.0; 
    double output = (obj.*func)(input); 
    //... 
} 

[Редактировать] В ответ на комментарий:

void Funktion::compute_bogen(){ 
    Romberg(&Funktion::q, *this, ...); 
}; 
+0

И как мне нужно вызвать функцию «Ромберг»? – Alex

+0

Спасибо большое, вот и все :) – Alex

1

Чтобы заставить его работать с системой класса, вам нужно определить fd взять указатель на функцию-член вместо указателя на функцию (обе не то же самое).

Тогда вам нужно будет вызвать его правильно для указателя на функцию-член (а это немного отличается от вызова указателя на функцию).

Я хотел бы отметить, что, хотя вы можете это сделать, вам может быть лучше рассмотреть несколько другую структуру. Один из них довольно распространен - ​​использовать виртуальную функцию, которую вы переопределите в разных производных классах. Затем вместо того, чтобы использовать указатель на функцию-член, вы выбираете объект, который реализует нужную функцию, и вызываете виртуальную функцию в этом объекте.

Смежные вопросы