从静态方法访问对象的属性

Access properties of object from static method

我正在针对需要静态回调函数的外部库进行编程。我将我的回调声明为静态的,但随后我失去了对要使用此回调修改的对象属性的访问权限。

.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);

通常在某些地方可以指定 void* userData,无论是在创建库对象时还是在注册回调时。您可以将其设置为指向您要从回调中访问的对象的指针。然后在回调中,您将 void* 指针转换回指向您的 class 的指针并通过它进行操作。

这样你就不能使用 C++ 智能指针,所以你必须自己处理对象生命周期。

addSelectionCallback 方法有一个可选参数 userData 指针。在那里您应该发送对象实例,然后您将在回调中收到它。

在方法内部,您可以类型转换为正确的对象类型并使用对象实例进行实际工作。

例如:

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

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