Хобрук: Ваш путь к мастерству в программировании

Вызов указателя функции-члена C++ из структуры

Я нашел информацию о вызове указателей на функции-члены 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);')

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

15.10.2011


Ответы:


1

Использовать:

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

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

15.10.2011
  • Ах идеально! Спасибо за ответ, и приведенный выше ответ дает рассуждение. 15.10.2011

  • 2

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

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

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

    (this->*(functionMap[0].command)(x, y));
    
    15.10.2011
  • Спасибо за объяснение. Приведенный ниже ответ работает (со скобками, включающими «это» вместо «functionMap». Спасибо за ответ. 15.10.2011
  • Я не был уверен точно, нужны они или нет. Хотя для этой проблемы я бы, вероятно, попробовал другое решение, например, просто используя if, или если требуется больше гибкости, какой-то шаблон Command. 15.10.2011
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..