Я программирую против внешней библиотеки, которая требует статической функции обратного вызова. Я объявил свой обратный вызов как статический, но затем я потерял доступ к свойствам объекта, которые я хочу изменить с помощью этого обратного вызова.
.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);
addSelectionCallback Метод имеет необязательный параметр для userData
указатель. Там вы должны отправить экземпляр объекта, который вы затем получите в обратном вызове.
Внутри метода вы можете привести тип к правильному типу объекта и выполнить фактическую работу с экземпляром объекта.
Например:
void MyClass::selCallback(void* userData, SoPath* selPath) {
static_cast<MyClass *>(userData)->classProperty = 3;
}
MyClass myInstance;
selNode->addSelectionCallback(MyClass::selCallback, &myInstance);
Обычно есть место, где void* userData
может быть указано либо при создании объекта библиотеки, либо при регистрации обратного вызова. Вы можете установить указатель на объект, к которому вы хотите получить доступ из обратного вызова. Затем внутри обратного вызова вы разыгрываете void*
верните указатель на ваш класс и управляйте им через это.
Таким образом, вы не можете использовать интеллектуальные указатели C ++, поэтому вам придется самим заботиться о времени жизни объектов.