目前我正在研究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