Указатель на функцию внутри класса в C++

Рейтинг: -1Ответов: 1Опубликовано: 25.03.2023

Внутри класса Matrix есть функции, которые получают 3 значения:

double Matrix::f(double a, int b, int c){
return a+b+c;
}
double Matrix::g(double a, int b, int c){
return a*b*c;
}

Есть еще 2 функции, 1-я создает указатель на f и g и передает в другую функцию, тк f(), g() получают 3 значения и возвращают double

double Matrix::fr(){
f_ptr = &f; 
double x1=fx(1,1,1);
f_ptr = &g;
x1+=fx(2,2,2);
return x1;
}

double Matrix::fx(int a, int b, int c){
return f_ptr(a,b,c);
}

Вся эта работа внутри одного класса Matrix Внутри класса создается указатель на функцию. Пробовал создавать несколькими способами:

typedef double (Matrix::*function)(double,int,int); // 1й способ
//typedef double (*function)(double,int,int); // 2й способ
//using function = double(*)(double, int, int); // 3й способ
//using function = double(Matrix::*)(double, int, int); // 4й способ
function f_ptr; // сам указатель

Все класса спокойно могу использовать указатели на внешние функции. 1-й и 4-й спобоб дают ошибку в функции fx: f_ptr(a,b,c) - E0109 выражение перед скобками вероятного вызова должно иметь тип функции (pointer-to-) и C2064 результатом вычисления фрагмента не является функция, принимающая 3 аргументов

Думаю попробовать такое: функции создавать вне класса. У меня файлы такие: main.cpp, Matrix.h, Matrix.cpp. Думаю создать функцию f(...) и g(...) внутри Matrix.cpp, но без Matrix:: и убрать их в Matrix.h чтобы они были функциями вне класса. Но, мне кажется, что это не прокатит. - да, это не сработало: жалоба на функцию "необъявленный идентификатор"

Ответы

▲ 1Принят

Брать указатель у метода можно используя конкретное имя класса :

f_ptr = & Matrix :: f ;
f_ptr = & Matrix :: g ;

А при вызове метода нужно указывать для какого конкретно объекта и ставить звёздочку к указателю так :

return (this ->* f_ptr)(a,b,c);
// или
return ((*this) .* f_ptr)(a,b,c);

Бинарный оператор ->* объединяет свой первый операнд, который должен быть указателем на объект типа класса, со вторым операндом, который должен быть типом указателя на член.
В выражении, содержающем .* оператор , первый операнд должен иметь тип класса и быть доступным для указателя на член, указанный во втором операнде, или доступного типа, однозначно производного от этого класса и доступного для него.