2012-02-02 28 views
1

我正在研究Cocos2D和Box2D遊戲。我剛剛爲遊戲界面創建了一個類,以便玩家可以選擇不同的控件類型。因爲我使用的Box2D的物理學似乎所有的類必須.mm而不是.M - 但是當我去定義HelloWorldLayer.h新的控制器對象,我得到以下錯誤:關於Objective-C對象聲明的C++錯誤?

「ISO C++禁止沒有類型的'SparkController'聲明「。 和 「預期」;「 '*'令牌之前。

我發現了幾篇文章,其中人們得到了類似的錯誤,但都是非常不同的情況。我明白這是可能由許多不同問題引起的一般性錯誤之一。

HelloWorldLayer.h中的SparkController實例的聲明如下所示。這是錯誤彈出:

SparkController *_controller; 

所以seeems像它試圖解析這條線作爲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; 

} 
+1

'HelloWorldLayer.h'是否導入'SparkController.h'?另外,'SparkController.h'是否導入'HelloWorldLayer.h'? – 2012-02-02 08:43:26

+0

是的,是的。感謝您檢查:-) – 2012-02-02 23:09:37

回答

2

它告訴你它不識別​​。看起來錯誤可能來自上面的行,或者您需要在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"

+0

它是'class SparkController;'還是'@class SparkController;'? – Ilanchezhian 2012-02-02 08:47:13

+0

在C++中,類不是\ @class。但我認爲@class也應該與C++類一起工作。無論哪種方式,即使您使用class/@類,您的實現文件(.mm)仍然需要#導入有問題的頭文件。 – LearnCocos2D 2012-02-02 10:08:53

+0

我嘗試在頂部添加\ @class SparkController和類SparkController。添加\ @class本身並沒有給出錯誤,但沒有解決上述錯誤。添加它沒有給出一個錯誤,因爲它與下面的線衝突,\ @interface:SparkController:NSObject等 – 2012-02-02 23:15:06

1

如果使用.mm文件擴展名,Xcod e假定你的代碼是Objective-C++,因此是C++錯誤信息。 關於錯誤信息本身,編譯器會抱怨它不知道任何關於​​的信息,即它在解析給出的代碼行之前沒有看到類型聲明。也許你忘了包含正確的頭文件。

+0

+1的全面答案:D – Kheldar 2012-02-02 08:47:40

0

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

+0

我不知道在哪裏/如何添加@class。我見過的所有Objective-C類的聲明都沒有。它應該進入.h還是.mm?你能提供一個例子嗎?謝謝! – 2012-02-03 00:57:56

+0

將它直接添加到.h文件的頂部。編輯:看看這個問題,答案是全面的:http://stackoverflow.com/questions/322597/class-vs-import – Kheldar 2012-02-03 09:34:00