2015-09-19 4 views
0

У меня есть два класса, один из тех, кто (класса оды) имеют частный элемент, который является функцией (указатель на функцию):Используя функцию класса в конструкторе другого класса

class ode 
{ 
private: 
    double T; 
    double (*sfn)(double,double,double*);//I mean this 
    int Ne; 

public: 
    ode(double t,double (*f)(double,double,double*),int N) 
    { 
     Ne=N; 
     T=t; 
     sfn=f; 
    } //..... 
} 

и сейчас Я хочу построить объект ode, который в своей конструкции должен использовать функцию (sfn) из другого класса !! Если я хочу использовать функцию, не принадлежащую к каким-либо классам, я должен просто написать имя этой функции в конструкторе. Но эта ситуация другая. Что я могу сделать? как я могу построить этот объект?

+0

Вы не можете передавать функции статического класса, используя эту подпись. Также вместо указателей на функции лучше определить интерфейс и передать ссылку на него. –

+0

Другой совет: используйте 'std :: function', он будет работать для простых функций и функций класса. –

+1

Помните, что функции-члены работают с данными из объекта класса, членом которого они являются. Они не имеют никакого смысла быть вызванным без их данных класса. Вы можете объявить * указатели функций * членов *, но они набираются в класс, в котором они входят, и для их вызова нужен объект такого типа. – Galik

ответ

0

Для вызова функции-члена требуется указатель на класс.

class X { 
    ... 
    double fn(double,double,double*); 
}; 

Для того чтобы получить указатель на член, вам понадобится такая идея.

X * pMember; // hold instance we want to call. 
typedef double (X::*funcPointer)(double, double, double *); 
funcPointer fPtr = X::fn; 

Тогда, наконец, можно назвать с

(pMember->*fPtr)(v1,v2,&v3); 

Во всех случаях класс X должен быть известен.

Причина использования этого шаблона - это когда есть несколько функций, которые разделяют подпись, которая используется по разным причинам. UI-системы (MFC, wxWidgets) используют этот метод для привязки события окна к функции обработчика.

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

class base { 
     virtual double func(double, double, double *) = 0; 
}; 
class X1 : public base { 
    double func(double, double, double *) 
    { 
     // implementation. 
    } 
}; 

class X2 : public base { 
    double func(double, double, double *) 
    { 
     // implementation. 
    } 
}; 

Каждая реализация X1, X2, ... обеспечивает измененное поведение, подходящее для виртуальной привязки.

Для этого требуется только член;

base * pBase; 
pBase->func(v1, v2, &v3); 
Смежные вопросы