Как вы передаете нестатическую функцию в качестве обратного вызова? - PullRequest
1 голос
/ 04 декабря 2011

В настоящее время я работаю с Qt и графическим движком, и во время инициализации экземпляра QGLWidget мне нужно передать несколько указателей функций моему движку.

Функция, которая ищет обратные вызовы:

virtual void Buffer::CreateCustom( byte* getsize, byte* makecurrent)

Qt предоставляет функцию makeCurrent , однако она не является ни байтом *, ни статической.

Я мог бы написать крошечную функцию-обертку, например, так:

void _stdcall MakeCurrent(void)
{
    QGLContext::makeCurrent();
}

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

void _stdcall LEWidget::leMakeCurrent(void)
{
    makeCurrent();
}

Но вы можете указывать только указатели на статические функции-члены.Если я это сделаю, я получу следующую ошибку:

ошибка C2352: 'QGLWidget :: makeCurrent': недопустимый вызов нестатической функции-члена.Нестатическая ссылка на элемент должна относиться к конкретному объекту.

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

Посмотрите на этот вопрос, я думаю, что это именно то, что вы хотите сделать:

Как реализовать обратный вызов в C ++?

1 голос
/ 04 декабря 2011

Вы не можете. Вот для чего существует std::function. Вам нужно либо изменить свой интерфейс, чтобы использовать std::function, повезти и найти какой-то аргумент void* context, либо сдаться.

0 голосов
/ 04 декабря 2011

Это потому, что невозможно определить (из POV компилятора), какой указатель this должен быть передан в эту функцию при вызове этого обратного вызова.Если вы действительно хотите передать указатель, вам придется использовать сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...