Доступ к свойствам объекта из статического метода

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

.h
static void selCallback(void* userData, SoPath* selPath);

.cpp
void MyClass::selCallback(void* userData, SoPath* selPath) {
classProperty = 3;
}

Есть ли способ, как создать статический обратный вызов, имея возможность доступа к моим текущим свойствам объектов? Библиотека, которую я использую, является библиотекой openInventor. Подключение обратного вызова выполняется с помощью следующего кода:

SoSelection *selNode = new SoSelection;
selNode->addSelectionCallback(MyClass::selCallback);

0

Решение

addSelectionCallback Метод имеет необязательный параметр для userData указатель. Там вы должны отправить экземпляр объекта, который вы затем получите в обратном вызове.

Внутри метода вы можете привести тип к правильному типу объекта и выполнить фактическую работу с экземпляром объекта.

Например:

void MyClass::selCallback(void* userData, SoPath* selPath) {
static_cast<MyClass *>(userData)->classProperty = 3;
}

MyClass myInstance;
selNode->addSelectionCallback(MyClass::selCallback, &myInstance);
1

Другие решения

Обычно есть место, где void* userData может быть указано либо при создании объекта библиотеки, либо при регистрации обратного вызова. Вы можете установить указатель на объект, к которому вы хотите получить доступ из обратного вызова. Затем внутри обратного вызова вы разыгрываете void* верните указатель на ваш класс и управляйте им через это.

Таким образом, вы не можете использовать интеллектуальные указатели C ++, поэтому вам придется самим заботиться о времени жизни объектов.

1

По вопросам рекламы [email protected]