目前我正在研究cocos2d + Box2D项目,因此我已经处理了一些Objective-C++代码。声明包含C++类型ivar的obj-c类接口
而且我现在面临这样的局面:
#import "cocos2d.h"
#import "Box2D.h"
@interface BasicNode : CCNode {
@private
ccColor3B _color;
b2Body *_body;
b2Fixture *_shape;
}
b2Body和b2Fixture是C,在Box2D.h
它的工作原理,如果BasicNode实施名为BasicNode.mm定义++类。
但是,如果我有一个使用BasicNode和进口BasicNode.h名为Game.m另一个文件,它不会编译,因为.m文件为对象 - 文件,不知道C++代码。
所以我决定搬到#进口“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++类类型作为对象 - 类特别是我使用ARC一个伟大的想法。
是否有更好的方法来处理它?我真的不希望做这样的事情
@interface BasicNode : CCNode {
@private
ccColor3B _color;
#ifdef __cplusplus
b2Body *_body;
b2Fixture *_shape;
#else
void *_body;
void *_shape;
#endif
}
编辑:也请告诉我,我会TWEAK方式引入任何问题?通过使C++类ivar看起来像其他纯粹Obj-C代码的Obj-C类。
看起来不错,除了C++类型成员没有更多合成属性。如果不引入新问题,我仍然更喜欢我的调整方式。 –
您仍然可以合成PIMPL类型的属性。将指向C++对象的指针作为指向Obj-C类的指针看起来是个不错的主意,但只要您不使用ARC,您可能就没问题。 – pmdj