【问题标题】:C++ Error on Objective-C object declaration?Objective-C 对象声明上的 C++ 错误?
【发布时间】:2012-02-02 08:27:51
【问题描述】:

我正在开发一款 Cocos2D 和 Box2D 游戏。我刚刚为游戏界面创建了一个类,以便玩家可以选择不同的控件类型。因为我在物理上使用 Box2D,似乎所有的类都必须是 .mm 而不是 .m - 但是当我在 HelloWorldLayer.h 中定义新的控制器对象时,我收到以下错误:

“ISO C++ 禁止无类型声明‘SparkController’”。 和 “预期的 ';'在 '*' 标记之前”。

我发现了几篇文章,其中人们遇到了类似的错误,但都是非常不同的情况。我觉得这是可能由许多不同问题引起的一般错误之一。

我的 SparkController 实例在 HelloWorldLayer.h 中的声明如下所示。这是弹出错误的地方:

SparkController *_controller;

所以它似乎试图将这一行解析为 C++ 代码? SparkController.h 和 SparkController.mm 类都完全用 Objective-C 编写,我什至没有在类中包含 Box2D,因为它不是必需的。为了查看 .mm 是否是问题所在,我尝试将 SparkController.mm 更改为 .m,编译器在放弃之前抛出了 200 个错误。所以我不知道我可能做错了什么。还有什么其他代码对我有用,可以帮助诊断问题?

编辑:感谢以下所有 cmets。不幸的是,您的建议都没有奏效。我包含了 SparkController.h 的头文件,也许它会帮助指出我做错了什么:

#import "cocos2d.h"
#import "HelloWorldLayer.h"

@interface SparkController : NSObject {
    BOOL _drawPreviewLine;
    CGPoint _touchStartLocation;
    float _previewAngle;
    float _sparkAngle;
    CCParticleSystemQuad *_spark;
}

@property (nonatomic, assign) BOOL drawPreviewLine;
@property (nonatomic, assign) CGPoint touchStartLocation;
@property (nonatomic, assign) float previewAngle;
@property (nonatomic, assign) float sparkAngle;
@property (nonatomic, retain) CCLayer *layer;

//+(id)initWithLayer:(CCLayer *)layer;

@end

@interface GestureController : SparkController{

}
+(id)initWithLayer:(CCLayer *)layer;
-(void)touchBeganAt:(CGPoint)touchStartLocation;
-(void)touchMovedTo:(CGPoint)touchLocation;
-(void)touchEndedAt:(CGPoint)touchLocation;

@end

@interface HybridController : SparkController{

}
+(id)initWithLayer:(CCLayer *)layer;
@end

@interface TouchController : SparkController{

}
+(id)initWithLayer:(CCLayer *)layer;
@end

如果有帮助,这里是 HelloWorldLayer.h 的相关部分:

#import "cocos2d.h"
#import "Box2D.h"
#import "MyContactListener.h"
#import "GLES-Render.h"
#import "SparkController.h"

// HelloWorldLayer
@interface HelloWorldLayer : CCLayer
{

...

    SparkController *_controller;   

}

【问题讨论】:

  • HelloWorldLayer.h 是否导入 SparkController.h?另外,SparkController.h 是否导入 HelloWorldLayer.h
  • 是的,是的。感谢您检查:-)

标签: objective-c ios xcode cocos2d-iphone


【解决方案1】:

它告诉你它无法识别SparkController。似乎错误可能源于上面的行,或者您可能需要 HelloWorldLayer.h 顶部的 class SparkController;

编辑:您的问题是您在 SparkController 中导入 HelloWorldLayer.h,在 HelloWorldLayer 中导入 SparkController.h。这行不通。您应该在实现 (.m) 文件中导入这些类,并在 .h 文件中转发声明类。

HelloWorldLayer.h: @class SparkController;

HelloWorldLayer.m: #import "SparkController.h"

SparkController.h: @class HelloWorldLayer;

SparkController.m: #import "HelloWorldLayer.h"

【讨论】:

  • class SparkController;还是@class SparkController;
  • 在 C++ 中它是类而不是 \@class。但我认为@class 也应该适用于 C++ 类。无论哪种方式,即使您使用 class/@class 您的实现文件 (.mm) 仍然需要#import 有问题的头文件。
  • 我尝试将 \@class SparkController 和类 SparkController 添加到顶部。添加 \@class 本身没有错误,但没有修复上述错误。添加它而不添加 at 会出现错误,因为它与下面的行冲突,\@interface : SparkController : NSObject 等。
  • 查看我的编辑。您在两个类中导致递归导入。
  • 太棒了 - 这听起来像门票 - 谢谢你的帮助:-)
【解决方案2】:

如果您使用.mm 文件扩展名,Xcode 假定您的代码是 Objective-C++,因此是 C++ 错误消息。 关于错误消息本身,编译器抱怨它对SparkController 一无所知,即在解析您给出的代码行之前它没有看到类型声明。也许你忘了包含正确的头文件。

【讨论】:

    【解决方案3】:

    检查您的 HelloWorldLayer 文件中是否存在 @class#import

    【讨论】:

    • 我不确定在哪里/如何添加@class。我见过的所有objective-c 类声明都没有。它应该以 .h 还是 .mm 为单位?你能举个例子吗?谢谢!
    • 将其直接添加到您的 .h 文件的顶部。编辑:看这个问题,答案很全面:stackoverflow.com/questions/322597/class-vs-import
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多