C ++ Ошибка при объявлении объекта Objective-C? - PullRequest
1 голос
/ 02 февраля 2012

Я работаю над играми 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 ошибок, прежде чем сдаться. Так что я понятия не имею, что я могу делать неправильно. Какой другой код было бы полезно разместить здесь, чтобы помочь диагностировать проблему?

РЕДАКТИРОВАТЬ: Спасибо за все комментарии ниже. К сожалению, ни одно из ваших предложений не сработало. Я включаю файл заголовка для 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 ]

2 голосов
/ 02 февраля 2012

Он говорит вам, что не распознает SparkController.Кажется, что ошибка может быть вызвана строкой выше или, возможно, вам нужно class SparkController; в верхней части HelloWorldLayer.h.

РЕДАКТИРОВАТЬ: Ваша проблема заключается в импорте HelloWorldLayer.h в SparkController и SparkController.hHelloWorldLayer.Это не будет работать.Вместо этого следует импортировать их в файлы реализации (.m) и пересылать объявления классов в файлах .h.

HelloWorldLayer.h: @class SparkController;

HelloWorldLayer.m: #import "SparkController.h"

SparkController.h: @class HelloWorldLayer;

SparkController.m: #import "HelloWorldLayer.h"

1 голос
/ 02 февраля 2012

Если вы используете расширение .mm, Xcode предполагает, что ваш код Objective-C ++, то есть сообщение об ошибке C ++.Что касается самого сообщения об ошибке, компилятор жалуется, что он ничего не знает о SparkController, то есть он не видел объявления типа перед анализом строки кода, которую вы дали.Может быть, вы забыли включить правильный заголовочный файл.

0 голосов
/ 02 февраля 2012

Проверьте наличие @class и #import в файлах HelloWorldLayer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...