我正在针对需要静态回调函数的外部库进行编程。我将我的回调声明为静态但后来我无法访问我想要使用此回调修改的对象属性。
.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 :(得分:1)
通常在创建库对象或注册回调时,可以指定void* userData
的某个位置。您可以将其设置为指向要从回调中访问的对象的指针。然后在回调中将void*
指针强制转换为指向类的指针并通过它操纵它。
这样你就不能使用C ++智能指针了,所以你必须自己处理对象的生命周期。
答案 1 :(得分:1)
addSelectionCallback方法有userData
指针的可选参数。在那里你应该发送你将在回调中收到的对象实例。
在方法中,您可以将类型转换为正确的对象类型,并使用对象实例进行实际操作。
例如:
void MyClass::selCallback(void* userData, SoPath* selPath) {
static_cast<MyClass *>(userData)->classProperty = 3;
}
MyClass myInstance;
selNode->addSelectionCallback(MyClass::selCallback, &myInstance);