2012-02-02 19 views
1

私はCocos2DとBox2Dのゲームに取り組んでいます。私はプレイヤーが異なるコントロールタイプを選択できるように、ゲームインターフェイスのクラスを作成しました。私は物理学のためにBox2Dを使用しているので、すべてのクラスは.mの代わりに.mmでなければならない - しかしHelloWorldLayer.hで新しいコントローラオブジェクトを定義すると、次のエラーが発生する:Objective-Cオブジェクト宣言でC++エラーが発生しましたか?

"ISO C++ Forbids 'タイプなしのSparkController'の宣言です。 と "期待しています"; ' '*'トークンの前に。

私はいくつかの記事を見つけました。そこでは、人々は同様のエラーを起こしましたが、すべてが非常に異なる状況でした。私はこれが、多くの異なる問題によって引き起こされる可能性のある一般的なエラーの1つであるという感覚を得る。

HelloWorldLayer.hのMy SparkControllerインスタンスの宣言は、次のようになります。エラーがポップアップところです:

SparkController *_controller; 

C++のコードとしてこの行を解析しようとしているようなので、それはseeems? クラス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'をインポートしますか? –

+0

はい、はい。チェックしていただきありがとうございます:-) –

答えて

2

​​が認識されないことを伝えています。上記の行からエラーが発生している可能性があります。または、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ではありません。でも、@classはC++クラスでも動作するはずです。いずれにしても、クラス/ @ classを使用していても、実装ファイル(.mm)はまだヘッダファイルを#importする必要があります。 – LearnCocos2D

+0

私は\ @class SparkControllerとクラスSparkControllerを先頭に追加しようとしました。 \ @classを追加すると、エラーは発生しませんでしたが、上記のエラーは修正されませんでした。 \ @interface:SparkController:NSObjectなどの行と競合しているため、atを付けずに追加するとエラーが発生しました。 –

1

あなたが.mmファイルを使用する場合拡張子、Xcod eは、あなたのコードがObjective-C++であると仮定して、C++エラーメッセージを生成します。 エラーメッセージ自体に関しては、コンパイラは​​について何も知らない、つまり指定したコード行を解析する前に型宣言を見たことがないという文句を言います。おそらく、あなたは正しいヘッダーファイルを含めるのを忘れていました。

+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

関連する問題