2013-03-19 3 views
2

У меня есть некоторые трудности с указателями функций. У меня есть базовый класс, который определяет указатель функции, который через typedef double (* function) (double * x) const;указатели функции const

  • Беглый сторона вопрос: почему выше ЬурейеЕ не компилировать?

    дает следующее сообщение об ошибке: об ошибке: «Const» и «летучих» функции спецификаторов на «функцию» недействительной в объявлении типа

Для части ниже я использую ЬурейиЙ двойную (* функцию) (двойной * x). Теперь каждый дочерний класс может реализовывать множество и разные версии функций этого типа. Через enum я выбираю функцию по своему выбору, которая устанавливает мой указатель на не-член (определенный в базовом классе), который должен быть инициализирован одним из этих указателей-членов дочернего класса. Вот фрагмент кода:

Исходный файл класса дочери:

PndLmdROOTDataModel1D::PndLmdROOTDataModel1D(interpolation_type intpol_type) { 
    if(intpol_type == CONSTANT) { 
    setModelFunction(&PndLmdROOTDataModel1D::evaluateConstant); 
    } 
    else if (intpol_type == SPLINE) { 
    setModelFunction(&PndLmdROOTDataModel1D::evaluateSpline); 
    } 
    else { 
    setModelFunction(&PndLmdROOTDataModel1D::evaluateLinear); 
    } 
} 

И базового класса (заголовочный файл):

class MultiModel1D: public Model1D { 
protected: 
    function model_func; 

public: 
    MultiModel1D(); 
    virtual ~MultiModel1D(); 

    void setModelFunction(function f); 
} 

При компиляции я получаю следующее сообщение об ошибке:

note: no known conversion for argument 1 from ‘double (PndLmdROOTDataModel1D::*)(double*)’ to ‘function {aka double (*)(double*)}’

Я использую указатель на функцию из-за проблем с производительностью (по крайней мере, я думаю, это должно быть f астра, чем постоянно работает через какой-либо коммутатор). Что я делаю не так? Возможно, есть и некоторые шаблоны дизайна, которые будут служить лучшей альтернативой ... Спасибо заранее!

Стив

+0

Возможный дубликат [указатель на функцию члена-члена typedef] (http://stackoverflow.com/questions/3050805/pointer-to-const-member-function-typedef) –

+0

Нижняя ошибка говорит все. Указатели функций не совпадают с указателями функций-членов. http://liveworkspace.org/code/1iUxos%242 – chris

+0

Обычная функция не может быть const ?? – yngccc

ответ

10

Это потому, что существует принципиальная разница между (свободномолекулярном) указатель функции и указатель на функцию члена. У вас «побочный вопрос» уже содержится намек на проблему. Для того, чтобы объяснить, вы можете сделать что-либо в этом:

typedef double (SomeClass::*function)(double *x) const; 

или

typedef double (*function)(double *x); 

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

Если они могли быть преобразованы, вы бы в конечном итоге с проблемой: Указатель функции член сообщает компилятору, что он нуждается объект, чтобы быть вызвана, которая будет введена в this, когда функция вызвана. Если указатель может быть отброшен на обычный указатель на функцию, этот объект будет отсутствовать, и, вероятно, все параметры будут перепутаны как следствие. Итак, нет, вы действительно не можете просто бросить их. Реальность еще сложнее (множественное/виртуальное наследование), но вы получаете картину ...

+0

thx для безумно быстрых answsers! Я получил часть const для функций, не являющихся членами, и не имеет никакого смысла. Но для второй ошибки я вынул все из const. В основном, мой вопрос заключается в том, почему компилятор не может использовать указатель функции-члена для указателя функции, отличного от члена. – steve

+0

@steve: Я добавил объяснение. –

6

По той же причине, что мы не будем писать:

void foo() const 
{ 
    // ... 
} 

вне объявления класса. Функции, не являющиеся членами, не могут быть const.

Ваш указатель на функцию - это обычный указатель на функцию, а не функция-указатель на элемент, и поэтому const не имеет смысла.

+0

ah true, что имеет смысл, thx! – steve

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