Как вызвать функции-члены класса с указателем на неклассную функцию? - PullRequest
0 голосов
/ 09 марта 2011

Таким образом, кажется, что ANTLR3C использует указатели функций, чтобы позволить пользователям переопределять их, если мы хотим написать свои собственные функции.Мне нужно переопределить функцию сообщения об ошибках:

Указатель

void(*displayRecognitionError)(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
                                 pANTLR3_UINT8 * tokenNames);

Функция

static void displayRecognitionError (pANTLR3_BASE_RECOGNIZER recognizer,
                                     pANTLR3_UINT8 * tokenNames);

Сейчас у меня есть следующее:

@lexer::apifuncs {
  RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
}

@lexer::includes {
  #include "lexerData.h"

  static void displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
                                          pANTLR3_UINT8 * tokenNames);
}

@lexer::members {
  #include "lexerError.h"
}

с новым кодом ошибки (который все работает) в файле lexerError.h.Я пытаюсь изменить это, перемещая функцию error внутри класса lexerData, но, к сожалению, я получаю ошибку компиляции, когда пытаюсь установить указатель функции на член класса.

compileUnit.cpp:179:62: error: argument of type ‘void (lexerData::)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’ does not match ‘void (*)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’

Из того, что я прочитал, это не простая проблема приведения или синтаксиса.Что я должен сделать, чтобы это позволить?Похоже, одним из исправлений было изменение определения указателя на функцию, но мне нужно иметь возможность назначить указатель на функцию для разных классов, так как лексер запускается дважды с разными структурами данных.

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Ответ лежит в этом вопросе .

Также boost::bind может вам помочь.У меня не так много информации об этом.

1 голос
/ 09 марта 2011

Как правило, невозможно просто назначить адрес нестатической функции-члена указателю на неклассную функцию. Вы можете создать неклассовую функцию, которая будет вызывать правильную функцию-член класса lexerData. Проблема заключается в том, что эта функция не класса должна иметь возможность ссылаться на объект lexerData каким-либо образом. Я ничего не знаю о ANTLR3C, поэтому, к сожалению, я не могу дать вам конкретный совет по этому поводу: (

0 голосов
/ 09 марта 2011

В C ++ каждая функция-член класса имеет скрытый параметр.Это указатель на экземпляр класса (this).Реализация этой функции не стандартизирована, поэтому вы не можете предполагать, что этот параметр может быть каким-то образом «найден» с какой-то определенной сигнатурой, например int foo(const MyClass*, int, int); вместо int foo(int, int); для класса MyClass.

Обычно это означает, что если у вас есть функция-член некоторого класса и вы хотите иметь указатель на нее, у вас есть проблема.Я помню, что в одном проекте мы использовали макросы C + таблица методов и классов использовалась для преобразования «указателей» на функции в реальные вызовы функций.Основная идея заключалась в том, чтобы «зарегистрировать» экземпляр класса с помощью макроса в некоторой глобальной таблице, а затем вызвать метод класса, используя дополнительную диспетчеризацию через эту таблицу.

...