現在、私はcocos2d + Box2Dプロジェクトに取り組んでいるので、いくつかのObjective-C++コードを扱っています。
そして、私はそのような状況に直面しています:
#import "cocos2d.h"
#import "Box2D.h"
@interface BasicNode : CCNode {
@private
ccColor3B _color;
b2Body *_body;
b2Fixture *_shape;
}
b2Bodyとb2Fixtureは、Box2D.hで定義されたC++クラスです。
BasicNodeの実装の名前がBasicNode.mmの場合に機能します。
しかし、BasicNodeを使用してBasicNode.hをインポートするGame.mという名前の別のファイルがある場合、.mファイルはObj-Cファイルであり、C ++コードを認識していないため、コンパイルされません。
そこで、#import "Box2D.h"を実装ファイルに移動し、型宣言のみをヘッドファイルに保持することにしました(これはまさにヘッダーファイルに含まれるべきものです)。
しかし、どうすればよいですか?これらはC++クラスタイプですが、実際には単なるポインターなので、ヘルパーマクロを作成しました。
#ifdef __cplusplus
#define CLS_DEF(clsname) class clsname
#else
#define CLS_DEF(clsname) struct clsname; typedef struct clsname clsname
#endif
CLS_DEF(b2Body);
CLS_DEF(b2Fixture);
これは、CLS_DEF(b2Body)が1回だけ表示される場合にのみ機能します。そうしないと、コンパイラは、同じ名前であっても、同じ名前の複数の型宣言を検出します。私が変更する必要があるより
#ifdef __cplusplus
#define CLS_DEF(clsname) class clsname
#else
#define CLS_DEF(clsname) @class clsname
#endif
そして、それは現在機能しています。
しかし、特にARCを使用している場合、C++クラス型をObj-Cクラスとして宣言するのは良い考えではないと思います。
それに対処するためのより良い方法はありますか?そして、私は本当にこのようなものを作りたくありません
@interface BasicNode : CCNode {
@private
ccColor3B _color;
#ifdef __cplusplus
b2Body *_body;
b2Fixture *_shape;
#else
void *_body;
void *_shape;
#endif
}
編集:また、私の微調整方法で問題が発生するかどうか教えてください?? C ++クラスを作成することにより、ivarは他の純粋なObj-CコードのObj-Cクラスのように見えます。