0

我正在开发一个使用 Box2d 的应用程序。当我尝试做这样的事情时:

NSString *s = @"wood";

bodyDef.userData.name = s; 

我收到错误

request for member 'name' in 'bodyDef.b2BodyDef::userData', which is of non-class type 'void*'

谢谢!

4

1 回答 1

2

您不能取消引用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++ 中是非法的,并且需要显式转换。

于 2011-09-16T19:26:07.203 回答