如何确定返回的指针的类型(Class)为void *?

时间:2014-06-17 10:57:55

标签: c++ box2d

我正在开发一个Box2d项目。

在特定的类构造函数中,我这样做:

this->body->SetUserData(this);

其中body是此类的成员。 body的类型为b2Body

稍后,我称之为方法:

body->GetUserData();

GetUserData()返回void*

如何确定void*类指向哪种类型?

编辑:对于那些不使用Box2d的人,可以将用户数据设置为包含所有非物理相关逻辑等的包装类,而b2Body代表物理主体。

编辑:例如,在Objective-C中,可以将void*投射到NSObject*,然后调用isMemberOf来确定它是否属于特定类型。

2 个答案:

答案 0 :(得分:3)

C ++没有任何内在功能可以让你确定void *指向的类型。你最好的选择可能是:

  1. 创建一个抽象基类,所有用户数据项都将从中派生出来。也许你已经有了一个。然后你可以假设void *将始终是从该基础派生的类型,并相应地使用它。
  2. 制作一个有区别的联合类型(或使用Boost.Variant),并始终将void *指向其中一个。
  3. 创建一个小结构,其中void *将始终指向一个实例,并使该结构成为您分配给void *的所有内容的第一个成员(这只有在您执行更多C-时才有效)样式编程,类没有干扰对齐的基础)。

答案 1 :(得分:1)

正如John Zwinck指出的那样简短的回答是,你不能。

使用void*是一个古老的C技巧,如何将用户可配置的数据添加到库中。这通常在将中间件库集成到更大的软件中时使用。这里的基本假设是你知道void*背后的类型。根据我在包装ODE和Bullet方面的经验,这非常有效。

基本上有两种情况,每种情况都知道void*背后的基本类型:

在第一种情况下,您在包装软件中的主体或几何与对象之间存在一对一的关联。在这种情况下,您只需reinterpret_cast到包装对象。

在第二种情况下,身体或几何体包含在某些游戏对象中#34;。这可以是场景中的任何对象。但通常所有"对象都在场景中#34;共享一个共同的基类。在这里,您只需假设您可以reinterpret_cast到基类。现在你手中有一个物体,你从这里做的事情取决于你。您可以在其上调用虚拟方法,使用dynamic_cast或一些自制反射。