gpt4 book ai didi

objective-c - 声明包含 C++ 类类型 ivar 的 obj-c 类接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:52 25 4
gpt4 key购买 nike

目前我正在做一个 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) 只出现一次时,它才有效。否则编译器会为同一个名称找到多个类型声明,即使它们是相同的。比我必须更改为

#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 类。

最佳答案

一个简单的解决方案是将 Game.m 重命名为 Game.mm

关于objective-c - 声明包含 C++ 类类型 ivar 的 obj-c 类接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8181034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com