В области действия main()
нет переменной с именем fPtr
. Вам необходимо обратиться к переменной-члену с помощью оператора ->
, а затем разыменовать указатель на член с помощью ->*
:
// main
MyClass *t = new MyClass;
// store function adress
t->fPtr = &MyClass::doIt;
(t->*(t->fPtr))();
В качестве альтернативы вы можете создать локальную переменную и присвоить ей указатель на член:
// main
MyClass *t = new MyClass;
// store function adress
t->fPtr = &MyClass::doIt;
void (MyClass::*fp)() const = t->fPtr;
(t->*fp)();
Последнее проясняет, зачем нужна странная конструкция выше. Вы также можете выполнить метод для объекта, отличного от того, для которого вы используете переменную-член типа указатель на член:
MyClass *s = new MyClass;
MyClass *t = new MyClass;
s->fPtr = &MyClass::f;
t->fPtr = &MyClass::g;
(t->*(s->fPtr))(); // Call f() on object *t
(s->*(t->fPtr))(); // Call g() on object *s
Объект слева от ->
сообщает компилятору, с какого объекта считывать указатель на член, в то время как объект слева от ->*
сообщает компилятору, с какого объекта вызывать функцию-член.