2012-02-02 2 views
1

저는 Cocos2D와 Box2D 게임을하고 있습니다. 플레이어가 다른 컨트롤 유형을 선택할 수 있도록 게임 인터페이스 용 클래스를 만들었습니다. 물리학을 위해 Box2D를 사용하고 있기 때문에 모든 클래스는 .m 대신에 .mm이어야합니다.하지만 HelloWorldLayer.h에서 새 컨트롤러 객체를 정의 할 때 다음 오류가 발생합니다.Objective-C 오브젝트 선언에 C++ 오류가 있습니까?

"ISO C++ Forbids 타입이없는 'SparkController'선언. 및 "예상 됨", ' before '*'토큰 ".

사람들이 비슷한 오류를 범했지만 모든 상황이 매우 다른 여러 기사를 발견했습니다. 나는 이것이 많은 다른 문제들로 인해 야기 될 수있는 일반적인 오류 중 하나라는 생각을 갖습니다.

HelloWorldLayer.h의 My SparkController 인스턴스 선언은 다음과 같습니다. 오류가 나타나는 곳입니다 :

SparkController *_controller; 

그래서이 줄을 C++ 코드로 구문 분석하는 것처럼 보입니까? SparkController.h 및 SparkController.mm 클래스는 모두 Objective-C로 작성되었으며 필요하지 않기 때문에 클래스에 Box2D를 포함하지 않았습니다. .mm이 문제인지 확인하기 위해 SparkController.mm을 .m으로 변경해 보았습니다. 컴파일러는 포기하기 전에 200 개의 오류를 던졌습니다. 그래서 나는 내가 뭘 잘못하고 있는지 전혀 모른다. 문제를 진단하는 데 도움이되도록 여기에 게시하는 것이 다른 어떤 코드가 유용할까요?

편집 : 아래의 모든 의견을 보내 주셔서 감사합니다. 불행히도 귀하의 제안은 효과가 없습니다.

#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; 

} 
+1

'HelloWorldLayer.h'는'SparkController.h'를 임포트합니까? 또한'SparkController.h'는'HelloWorldLayer.h'를 임포트합니까? –

+0

예, 예. 확인해 주셔서 감사합니다 :-) –

답변

2
가 나는 어쩌면 내가 잘못 한 일을 지적 도움이 될 것입니다, SparkController.h에 대한 헤더 파일을 포함하고있어

SparkController을 인식하지 못한다는 메시지가 표시됩니다. 위의 줄에서 오류가 발생하거나 HelloWorldLayer.h 상단에 class SparkController;이 필요합니다.

EDIT : 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"

+0

'class SparkController; 또는'@class SparkController;'입니까? – Ilanchezhian

+0

C++에서는 클래스가 \ @ 클래스가 아닙니다. 하지만 @class는 C++ 클래스에서도 작동해야한다고 생각합니다. 어느 쪽이든, 클래스/@ 클래스를 사용하더라도 구현 파일 (.mm)은 여전히 ​​# 헤더 파일을 가져와야합니다. – LearnCocos2D

+0

나는 \ @class SparkController와 클래스 SparkController를 추가하려고 시도했다. \ @class를 추가하면 오류 자체는 발생하지 않았지만 위의 오류는 해결되지 않았습니다. 아래에있는 줄과 충돌했기 때문에 at를 추가하지 않고 오류를 발생 시켰습니다. \ @interface : SparkController : NSObject 등 –

1

당신은 .mm 파일을 사용하는 경우 확장, Xcod e는 사용자 코드가 Objective-C++라고 가정하므로 C++ 오류 메시지입니다. 오류 메시지 자체에 대해 컴파일러는 SparkController에 대해 알지 못한다고 불평합니다. 즉, 사용자가 지정한 코드 줄을 구문 분석하기 전에 형식 선언을 보지 못했습니다. 올바른 헤더 파일을 포함하는 것을 잊었을 수도 있습니다.

+0

+1에 대한 포괄적 인 답변 : D – Kheldar

0

HelloWorldLayer 파일에 @class#import 존재 여부를 확인하십시오.

+0

@class를 추가하는 방법/방법을 모르겠습니다. 내가 본 모든 objective-c 클래스 선언에는 없었습니다. 그것은 .h 또는 .mm으로 가야합니까? 예제를 제공해 줄 수 있습니까? 감사! –

+0

.h 파일의 맨 위에 직접 추가하십시오. 편집 :이 질문을 봐, 답변 포괄적입니다 : http://stackoverflow.com/questions/322597/class-vs-import – Kheldar

관련 문제