目前我正在做一个 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,它就可以工作。
但是如果我有另一个名为 Game.m 的文件正在使用 BasicNode 并导入 BasicNode.h,它将无法编译,因为 .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) 只出现一次时,它才有效。否则编译器会找到同名的多个类型声明,即使它们是相同的。比我必须改变
#ifdef __cplusplus
#define CLS_DEF(clsname) class clsname
#else
#define CLS_DEF(clsname) @class clsname
#endif
它现在正在工作。
但我认为将 C++ 类类型声明为 Obj-C 类并不是一个好主意,尤其是我使用的是 ARC。
有没有更好的方法来处理它?而且我真的不想做这样的事情
@interface BasicNode : CCNode {
@private
ccColor3B _color;
#ifdef __cplusplus
b2Body *_body;
b2Fixture *_shape;
#else
void *_body;
void *_shape;
#endif
}
编辑:另外请告诉我我的调整方式会引入任何问题吗?通过使 C++ 类 ivar 看起来像其他纯 Obj-C 代码的 Obj-C 类。