Учитывая класс в качестве примера:
class Fred
{
public:
Fred()
{
func = &Fred::fa;
}
void run()
{
int foo, bar;
*func(foo,bar);
}
double fa(int x, int y);
double fb(int x, int y);
private:
double (Fred::*func)(int x, int y);
};
Я получаю ошибку компилятора в строке, называя функцию членства через указатель "*func (нечто, панель)", говоря: "термин не оценивает к функции, берущей 2 аргумента". Что я делаю неправильно?
Нужный вам синтаксис выглядит так:
((object).*(ptrToMember))
Итак, ваш вызов будет следующим:
((*this).*(func))(foo, bar);
Я считаю, что альтернативный синтаксис будет:
(this->*func)(foo, bar);
Для вызывать функции-члены через указатель:
(this->*func)(foo, bar);
Нестатические функции-члены класса скрыли этот указатель как аргумент.
Думаю, синтаксис (это -> * func) (foo, bar) это способ заставить компилятор понять, что ему нужно добавить это в функцию.
Есть две вещи, о которых вам нужно позаботиться. Во-первых, это объявление типа указателя функции:
private:
typedef double (Fred::*fptr)(int x, int y);
fptr func;
Далее - синтаксис вызова функции с помощью указателя:
(this->*func)(foo,bar)
Вот модифицированный пример кода, который будет компилироваться и выполняться:
#include <iostream>
class Fred
{
public:
Fred()
{
func = &Fred::fa;
}
void run()
{
int foo = 10, bar = 20;
std::cout << (this->*func)(foo,bar) << '\n';
}
double fa(int x, int y)
{
return (double)(x + y);
}
double fb(int x, int y)
{
}
private:
typedef double (Fred::*fptr)(int x, int y);
fptr func;
};
int
main ()
{
Fred f;
f.run();
return 0;
}
Функция-член с двумя аргументами на самом деле является функцией с тремя аргументами. 'this' - неявный аргумент, поэтому вы получаете ошибку, связанную с отсутствием аргумента 'this'.