У меня есть простой код
class a{
public:
double (a::*fun)(const double &) const;
//
....
//
};
class b{
public:
a c1;
double f(const double & x) const{
return 0;
}
b(){
c1.fun = f;
}
};
Это означает, что класс «а» должен работать с функциями определенного типа, и его работа не зависит от реализации этой функции (например, алгебраическая интерполяция). Я хочу сделать параметр класса — функции.
Но у меня есть некоторые проблемы. Написать компилятор
значение типа «int (b ::) (const int &x) const «нельзя присвоить объекту типа» int (a ::) (const int &) const «
Как это сделано правильно?
double (a::*fun)(const double &) const
объявляет указатель на функцию-член класса a
которые возвращают двойной и принимает const double&
,
В вашем примере вы пытаетесь назначить функцию, определенную в классе b
, вот почему вы получаете ошибку.
Возможно, шаблон решит это:
template <typename T>
struct Params
{
double (T::* fun)(const double &) const;
// ...
};class B
{
Params<B> params;
double f(const double &) const;
public:
B() : params(&B::f) { }
// ...
};
Чтобы вызвать функцию где-нибудь в нестатической функции-члене B
в текущем случае вы бы сказали:
double d;
(this->*params.fun)(d);