Учитывая, что вы изменили поле ptrParser
на общедоступное, вам нужно написать main
следующим образом:
int main()
{
Parser parser;
parser.setupPtr();
(parser .* (parser.ptrParser))(1, 2, 3);
return 0;
}
Давайте попробуем разобраться в строке.
Во-первых, для вызова функции указателя на член типа void (Parser::*)(int, int, int)
, учитывая экземпляр Parser
с именем inst
и функцию указателя на член func
, синтаксис:
(inst .* func)(x, y, z);
В нашем случае экземпляр называется parser
, а указатель на функцию-член сохраняется в поле ptrParser
класса parser
, доступ к которому осуществляется с помощью синтаксиса parser.ptrParser
. Заменив его в предыдущем выражении, это дает нам (добавление скобок, потому что я не уверен в приоритетности операторов):
(parser .* (parser.ptrParser))(x, y, z);
Если вместо ссылки или объекта у нас есть указатель на Parser
, синтаксис будет:
int main()
{
Parser *parser = createAndInitializeParser();
(parser ->* (parser->ptrParser))(1, 2, 3);
markParserAsNotUsedDestroyIfNeeded(parser);
return 0;
}