Вызов функций C ++ из массива указателей функций - PullRequest
0 голосов
/ 22 октября 2018

Я использую указатели на функции, хранящиеся в массиве с typedef, определяющим указатель, и я немного растерялся из-за того, как я должен вызывать функцию.

вот часть Menu.h:

typedef void( Menu::*FunctionPointer )();

FunctionPointer* m_funcPointers;

вот часть Menu.cpp:

Menu::Menu()
    : m_running( true )
    , m_frameChanged( true )
    , m_currentButton( 0 )
    , m_numOfButtons( k_maxButtons )
    , m_menuButtons( new MenuButton[k_maxButtons] )
    , m_nullBtn( new MenuButton( "null", Vector2( -1, -1 ) ) )
    , m_frameTimer( 0 )
    , m_funcPointers( new FunctionPointer[k_maxButtons])
{
    m_timer.start();
    clearButtons();
    mainMenu();
}

void Menu::enterButton()
{
    m_funcPointers[m_currentButton]();//Error here
}

void Menu::mainMenu()
{
    m_funcPointers[0] = &Menu::btnPlay;
    m_menuButtons[0] = MenuButton("Play", Vector2(0, 0));

    m_funcPointers[1] = &Menu::btnHiScores;
    m_menuButtons[1] = MenuButton("HiScores", Vector2(0, 1));

    m_funcPointers[2] = &Menu::btnExit;
    m_menuButtons[2] = MenuButton("Exit", Vector2(0, 2));
}
void Menu::btnPlay()
{
    StandardGame* game = new StandardGame();

    game->play();

    delete game;
}

m_currentButton - целое число, используемое в качестве индекса.Я не уверен, как на самом деле вызвать функцию, так как приведенная выше строка выдаёт мне эту ошибку:

**C2064 term does not evaluate to a function taking 0 arguments**

, а Visual Studio выдаст мне следующее:

expression preceding parentheses of apparent call must have (pointer-to-) function type

Я не знаюкак решить вышеуказанную проблему и связано ли это с тем, как я вызываю функцию или как я ее храню.Заранее спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Вызов функций из массива указателей функций

Вы вызываете указатель на функцию в массиве так же, как если бы вы вызывали функцию, которой нет в массиве.

Ваша проблема не в том, как вызвать указатель на функцию в массиве как таковой.Ваша проблема в том, что вы пытаетесь вызвать указатель на функцию-член, как если бы это был указатель на функцию.

Вы можете вызвать указатель на функцию-член следующим образом:

Menu menu; // you'll need an instance of the class
(menu.*m_funcPointers[m_currentButton])();

Изменить для новогоПример кода: Поскольку вы находитесь в функции-члене, возможно, вы намереваетесь вызвать указатель на функцию-член на this:

(this->*m_funcPointers[m_currentButton])();

Если вы найдете синтаксис болезненным для чтения, я не буду винить вас,Вместо этого я предлагаю использовать std::invoke (доступно начиная с C ++ - 17):

std::invoke(m_funcPointers[m_currentButton], this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...