0

cocos2dフレームワークを使用してiPhoneゲームに取り組んでいますが、最近、解決できないと思われる問題が発生しました。プロジェクトに新しいクラスを追加し、その中でいくつかの作業を行った後、コードをコンパイルしようとしましたが、触れたことのないクラスのいくつかが壊れました。それらのクラスは、外部クラスをインポートする方法を忘れているようです。いくつかのクラスでエラーが発生していますが、その一例を次に示します。

#import "cocos2d.h"
#import "XZombie.h"
#import "WayPoint.h"
#import "XBuilding.h"

//@class XBuilding;

@interface Hoarde : CCNode
{
    float _spawnRate;
    int _totalXombies;
    NSMutableArray *_path;
    XBuilding *_target;
    NSMutableArray *_zombies;
    bool _zombiesReset;
}

@property (nonatomic) float spawnRate;
@property (nonatomic) int totalXombies;
@property (nonatomic, retain) NSMutableArray *path;
@property (nonatomic, retain) XBuilding *target;
@property (nonatomic, retain) NSMutableArray *zombies;
@property (nonatomic, assign) bool zombiesReset;

- (id) initWithZombieCount:(int)totalXombies Target:(XBuilding *) target SpawnRate:(float)spawnrate;
- (void) resetZombies;

@end

XBuilding *_target;
コメントを外すとエラー@class XBuilding;が消えるので、問題は実際には解決されませんが、それを回避するためのツールが提供されます。


問題が発生しているすべてのファイルに対してトリックを実行すれば@class、それを回避できます。問題は、specifier-qualifier-listのエラー以外に、新しい(ただし同様の)エラーが発生することです。コードのいくつかの行は私にExpected a ')' before *tokenまたはを与えますExpected a ';' before *token。これらの行は通常、前のエラーも発生させたので、@ classトリックも同様に機能しましたが、なぜこのようなものが実行していることを実行しているのか、私には少しもわかりません。私はどこか(cocos2dフォーラムだと思います)で、.mファイルの名前を.mmに変更することでうまくいくかもしれないと読んだのですが、私にとってはそうではありませんでした。

ですから、私は自分のプロジェクトに取り組み続けることができますが、将来そのようなことを避けるために地球上でどのようにすべきかを本当に知りたいです...

4

1 に答える 1

1

インポートClassB.hインClassA.hやその逆など、循環依存関係があるかどうかを確認してください。これは、「Expectedspecifier-qualifier-listbefore...」エラーが発生する典型的なシナリオです。

@class以下を除いて、ヘッダーファイルでのみ使用することをお勧めします。

  • #importスーパークラスを
  • #importクラスが実装するプロトコルを使用する

ヘッダーファイルは#import、実装ファイルで編集する必要があります。

「Objective-Cプログラミング言語」は次のように述べています。

この@classディレクティブは、コンパイラーとリンカによって認識されるコードの量を最小限に抑えるため、クラス名の前方宣言を行う最も簡単な方法です。シンプルであるため、他のファイルをインポートするファイルのインポートに伴う潜在的な問題を回避できます。たとえば、あるクラスが別のクラスの静的に型指定されたインスタンス変数を宣言し、それらの2つのインターフェイスファイルが相互にインポートする場合、どちらのクラスも正しくコンパイルされない可能性があります。

その他のリファレンス:

于 2012-04-27T01:52:44.820 に答える