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;

C および Objective-C では、他のポインタ型への暗黙的なキャストのみを行うことができることに注意してくださいvoid*。C++ および Objective-C++ ではこれを行うことは違法であり、明示的なキャストが必要です。

于 2011-09-16T19:26:07.203 に答える