我正在开发一个使用 Box2d 的应用程序。当我尝试做这样的事情时:
NSString *s = @"wood";
bodyDef.userData.name = s;
我收到错误
request for member 'name' in 'bodyDef.b2BodyDef::userData', which is of non-class type 'void*'
谢谢!
我正在开发一个使用 Box2d 的应用程序。当我尝试做这样的事情时:
NSString *s = @"wood";
bodyDef.userData.name = s;
我收到错误
request for member 'name' in 'bodyDef.b2BodyDef::userData', which is of non-class type 'void*'
谢谢!
您不能取消引用void*
C、C++ 或 Objective-C 中的指针。指针是指向未知数据类型的void*
指针——当你使用它时,你是在告诉编译器“它指向某物,但我不知道那东西到底是什么”。
当您将用户数据分配给 Box2D 对象时,它会将其视为一个不透明的指针:它会根据需要复制它,但它从不查看指针指向的数据。那是你的工作。
为了得到一个可用的指针,你只需要将它(隐式或显式)转换为正确的类型。假设您使用的是通用数据结构,您可以执行以下操作:
struct MyUserData
{
NSString *name;
// other data
};
...
// Allocate and initialize the user data
MyUserData *userData = malloc(sizeof(MyUserData);
userData->name = @"wood";
// etc.
bodyDef.userData = userData;
...
// To access the data, use an explicit cast or an implicit cast:
NSString *name = ((MyUserData *)bodyDef.userData)->name; // explicit
MyUserData *userData = bodyDef.userData; // implicit
NSString *name = userData->name;
请注意,您只能从void*
C 和 Objective-C 中的其他指针类型进行隐式转换——这样做在 C++ 和 Objective-C++ 中是非法的,并且需要显式转换。