【发布时间】:2013-08-27 19:15:43
【问题描述】:
我正在编写一个使用旧 3D 模型文件格式(如果您有兴趣,Carbon Graphics 的 GEO)的模拟,并且这种模型格式的 OpenSceneGraph 插件更新其内部变量的方式是您注册一个回调模型在更新其值时调用的方法。回调具有模拟时间、变量名称及其当前值。您将返回该变量的新值。
所以,在我的代码中,我将回调设置如下:
headerNode->setUserUpdate(&FlightDriver::updateGeoVariable);
headerNode 所属的类有以下变量:
double (* uvarupdate)(const double t, const double val, const std::string name);
每个间隔,它都会调用我设置的uvarupdate:
updateGeoVariable(const double time, const double val, const std::string name)
{
return flightData->getValue(name);
}
对于模型中的每个变量,一次一个。我无法将方法或 flightData 成员设为静态,因为它们需要在每个实例中都是唯一的。
我有一种预感,这个回调可能是从 C 代码调用的,因为当我中断时,它似乎不知道它在一个类中,如果我更改签名,相同的三个值会被传递并且硬塞进任何参数是第一个。
但是,我真的需要访问班级的成员,以避免真正肮脏的混乱。由于类本身是驱动 3D 世界中模型的驱动因素,因此拥有 2 个或更多这些意味着我会收到如下回调:“234,pitch,90”,我无法知道数据属于哪个模型的变量。
我可能会重新编译 DLL(因为它是一个 OSG 插件)以另外获取指向该实例的指针、id 或其他内容,并在回调中返回它,但我真的很想避免这种情况,如果可能。
我读过关于 thunking 的文章,但它看起来像这样,而且大多数其他想法都需要访问创建回调的代码。有什么想法吗?
【问题讨论】:
标签: c++ static callback static-members openscenegraph