2013-02-19 4 views
1

Я пытаюсь создать код, который найдет числовой вывод функции. я также полином класс описывается следующим образом:Указатель функции члена класса, который использует другой член класса

class polynomial 
    { 
    public: 
     polynomial(Vector, int); 
     polynomial(); 
     ~polynomial(); 

     double returnValue(double); 
     void print(); 

    private: 
     int Degree; 
     Vector Coeficients; 
    }; 

мой численный вывод имеет следующий прототип:

double numericalDerivation(double (*F) (double), double x); 

Я хочу передать метод ReturnValue в numericalDerivation, является то, что это возможно?

+0

Нет. 'ReturnValue' не является функцией, т. Е. Вы не можете * вызывать * его. Найдите на этом сайте сотни дубликатов о том, как обращаться с указателями функций-членов. –

+0

Собственно, 'returnValue' - это функция, но функция-член. 'numericalDerivation' ожидает указатель на функцию, а не указатель на функцию-член (это будет другой тип). – jogojapan

ответ

0

Да, это возможно, но не стоит забывать, что это член функция: вы не сможете назвать его, не имея (указатель) объект типа polynomial, на котором, чтобы вызвать его.

Вот как сигнатура вашей функции должен выглядеть следующим образом:

double numericalDerivation(double (polynomial::*F)(double), polynomial* p, double x) 
{ 
    ... 
    (p->*F)(x); 
    ... 
} 

Вот как вы бы ссылаться на него:

double d = ...; 
polynomial p; 
numericalDerivation(&polynomial::returnValue, &p, d); 

В качестве альтернативы, вы можете использовать std::function<> объект в качестве параметра вашу функцию, и пусть std::bind() позаботится о привязке объекта к функции-члена:

#include <functional> 

double numericalDerivation(std::function<double(double)> f, double x) 
{ 
    ... 
    f(x); 
    ... 
} 

... 

double d = ...; 
polynomial p; 
numericalDerivation(std::bind(&polynomial::returnValue, p, std::placeholders::_1), d); 
+0

Спасибо за ваше решение, первое решение работает также, если я использую перегрузки, я попробовал второе решение и получил следующую ошибку: термин не оценивает функцию, принимающую 1 аргумент, она работает сейчас, спасибо! –

+0

@LucasDaRochaSouza: Подождите, это работает или нет? –

+0

Извините за беспорядок, теперь он работает, спасибо. –

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