Вызов указателя на функцию-член C ++ из структуры - PullRequest
6 голосов
/ 15 октября 2011

Я нашел информацию о вызове указателей на функции-члены C ++ и вызове указателей в структурах, но мне нужно вызвать указатель на функцию-член, который существует внутри структуры, и я не смог получить правильный синтаксис.У меня есть следующий фрагмент внутри метода в классе MyClass:

void MyClass::run() {
    struct {
        int (MyClass::*command)(int a, int b);
        int id;
    } functionMap[] = {
        {&MyClass::commandRead,  1},
        {&MyClass::commandWrite, 2},
    };

    (functionMap[0].MyClass::*command)(x, y);
}

int MyClass::commandRead(int a, int b) {
    ...
}

int MyClass::commandWrite(int a, int b) {
    ...
}

Это дает мне:

error: expected unqualified-id before '*' token
error: 'command' was not declared in this scope
(referring to the line '(functionMap[0].MyClass::*command)(x, y);')

Перемещение этих круглых скобок приводит к ошибкам синтаксиса, рекомендуя использовать. * Или -> *ни один из которых не работает в этой ситуации.Кто-нибудь знает правильный синтаксис?

Ответы [ 2 ]

8 голосов
/ 15 октября 2011

Использование:

(this->*functionMap[0].command)(x, y);

Протестировано и компилируется;)

5 голосов
/ 15 октября 2011

Я не скомпилировал никакого кода, но просто глядя на него, я вижу, что вам не хватает нескольких вещей.

  • Удалите MyClass:: из того места, где вы вызываете указатель на функцию.
  • Необходимо передать указатель this на функции (если они используют какие-либо данные экземпляра), так что это означает, что вам нужен экземпляр MyClass для его вызова.

(После небольшого исследования) Похоже, вам нужно сделать что-то вроде этого (также благодаря @VoidStar):

(this->*(functionMap[0].command)(x, y));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...