1

ヘッダー ファイルの特定の場所に特定の宣言を配置すると、コンパイル エラーが発生することに気付きました。特定のことがどこに行くと思うかについて、コードにコメントを入れました。彼らは正しいですか?

@interface Level : CCNode { 
    //Instance variables?
    PlayBackgroundLayer* playBGLayer;
    PlayUILayer* playUILayer;
    PlayElementLayer* playElementLayer;
}

//Static methods?
+(void) InitLevel: (int) levelNumber;
+(Level*) GetCurrentLevel;

//Property declarations for instance variables?
@property (nonatomic, retain) PlayBackgroundLayer* playBGLayer;
@end

//Static variables?
Level* currentLevel;
PlayTilemapLayer* playTilemapLayer;
4

2 に答える 2

1

通常、インスタンス変数は明示的に宣言する必要はありません。それらは、プロパティのときに作成され@synthesizeます。ただし、それらが必要な場合は、(新しい) 正しい場所* が実装ブロックの上部にあります。

@implementation Level
{
    PlayBackgroundLayer* playBGLayer;
    PlayUILayer* playUILayer;
    PlayElementLayer* playElementLayer;
}

これらは静的メソッドではなく、クラス メソッドですが、そうです、ここで宣言します。クラスメソッドの前@propertyに宣言を置きたい人もいますが、それは意見の問題です。インスタンス メソッドはこれらの両方の後に続きますが、技術的に言えば順序は重要ではありません。つまり、コンパイラは気にしません。読みやすさだけの問題です。

ただし、これらの最上位の変数は、ヘッダー ファイル以外の場所に配置する必要があります。それらをそこに置くと、ヘッダーをインポートするすべてのファイルがそれらの変数のストレージを再宣言しているように見えるため、コンパイルエラーが発生しますが、これは許可されていません。

通常、そのような変数は .m ファイルに入れます。そこからのみ表示したい場合は、 を使用しますstatic。ヘッダーをインポートする他のファイルからそれらを表示したい場合は、オフのままにして、ヘッダーのようにstatic変数を宣言します。extern

extern Level* currentLevel;

これにより、変数のストレージが別の場所で予約されていることがコンパイラに通知されます。


※ TOCPLの「クラスインターフェース」を参照。

于 2012-06-13T01:30:20.480 に答える
1

1つを除いて、あなたはすべての点で正しいです。最後の変数は静的変数ではなく、グローバル変数です。静的変数は、 static キーワードで宣言された単純な変数であり、他の言語とは少し異なる意味を持ちます。それらはクラス変数ではなく、宣言されているファイルにのみ表示され、宣言されたスコープ内でのみ表示される変数です(関数内で宣言すると、他の関数は表示されません)。ただし、ご想像のとおり、インスタンスの数に関係なく、宣言は 1 回だけです。あなたが行ったように static キーワードなしでインターフェイスの外で何かを宣言すると、他のクラスはそれらをインポートします。ただし、これは理想的な方法ではありません (複数のクラスがこのヘッダーをインポートすると、再定義エラーが発生する可能性があります)。

また、1 つの注意点として、プロパティに明示的なバッキング変数を指定する必要はありません (@synthesizeキーワードを使用すると、コンパイラがバッキング変数を作成します) が、もちろん必要な場合は問題ありません。

最後に、静的メソッド クラス メソッドインスタンス メソッドではない唯一の理由は、マイナス (-)文字ではなくプラス (+)文字で始まるためであることに注意してください。

于 2012-06-13T01:30:32.897 に答える