Objective-C对象声明的C ++错误?

时间:2012-02-02 08:27:51

标签: objective-c ios xcode cocos2d-iphone

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

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

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

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

SparkController *_controller;

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

编辑:感谢下面的所有评论。不幸的是,你的建议都没有用。我包含了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;   

}

3 个答案:

答案 0 :(得分:2)

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

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

HelloWorldLayer.h: @class SparkController;

HelloWorldLayer.m: #import "SparkController.h"

SparkController.h: @class HelloWorldLayer;

SparkController.m: #import "HelloWorldLayer.h"

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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