В настоящее время я работаю над проектом cocos2d + Box2D, поэтому я имею дело с некоторым кодом Objective-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.
Но если у меня есть другой файл с именем 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.