2009-02-27 9 views
0

私は本当にこの質問をするのは躊躇しています。それは本当に簡単な答えですが、それは分かりません。ここに行く:Objective-Cクラスの関係

私は、ファイル内でこのObjective-CのコードはCopier.hと呼ばれるがあります。

#import <Cocoa/Cocoa.h> 
#import "CopyQueue.h"; 


@interface Copier : NSObject { 
    IBOutlet NSTextField *statusField; 
    IBOutlet NSTextField *toField; 
    CopyQueue *queue; 
} 
- (IBAction)startCopy:(id)sender; 
- (void)dropFile:(NSString *)theFileName; 
@end 

そして、私はXcodeで私のプロジェクトをコンパイルしようとするたびに、私はそれがCopyQueue *queue;という行で構文エラーを取得します私は間違って何をしていますか?

私はid *queue;に行を変更するとファイルがコンパイルされますが、それは解決策ではありませんか?入力されたすべての参照を一般的なものに置き換えますか?

+0

CopyQueueの定義が含まれていることを確認しましたか? – anand

答えて

1

してみてください...

@class CopyQueue 

@interface { 
    ... 
} 

... 

@end 
+0

恐ろしい!あなたは最高です:)私はそれを逃した可能性があるか分からない。 – winsmith

1

Predeclaring CopyQueueは必要ありません( "@class CopyQueue" デビッド・マッグロウが掲載こと)ポスターは、すでにライン「の#import "CopyQueue.h" を書かれているように; "おそらく不要な ";" 「の#import 『CopyQueueは』問題を引き起こしている?いずれにしても

、CopyQueueが(同じスペルとケース付き)CopyQueue.hファイルで適切に宣言されていることを確認した後。

+0

CopyQueue.hは、私が知る限り、正しいものです。 #import "CopyQueue.h"の後にセミコロンを削除すると、何も変わりません。 CopyQueue.hは@class CopyQueue文を含んでいなければなりませんか? – winsmith

0

これではありませんCのような静的型付けされたコンパイルされた言語(Cの上位セットであるObjective-C)を使うことのより複雑な側面の1つを反映しています(Python、Ruby、PHPなどの動的型付き言語。)、これは少しでこぼこ移行することができます。

あなたは(C++、Objective-CのまたはCタイプを使用する前に)、あなたはその型を宣言する必要があります。それは、@interface CopyQueue : SomeClass {} @endを使用して(宣言されなければならないのでCopyQueueは、タイプですまたは暗黙的に@class CopyQueueを使用して宣言されています。あなたが投稿の例では、ココアのプログラマはCopyQueue.hが、これは(Lyndseyファーガソンへのあなたのコメントは、それがないことを示唆している)場合ではない場合、あなたはヘッダを含まなければならない。この

@interface CopyQueue : SuperClass { //where SuperClass is the name of the class that CopyQueue inherits from 

    ... 
    } 
... 
@end 

のようなものが含まれていることを前提としていますCopyQueueクラス型を定義するファイル(上記)、またはCopyQueueがクラス(@class CopyQueueを使用している)であることをコンパイラーに伝えます。

@class CopyQueue宣言は、それはObjective-Cのクラス(タイプID)へのポインタとしてCopyQueue*を扱うことができ、コンパイラに伝える方法であり、あなたが(そのようCopyQueueのインスタンス変数やメソッドなど)の詳細を記入しましょうということ後で@interfaceを介して(別のモジュールなどで)

+0

http://bitbucket.org/winsmith/copymeister/src/でソースをご覧ください。 CopyQueueの定義はファイルに含まれていますが、まだ動作させるためには@ class-lineが必要です。 (それは私のために大丈夫ですbtw) – winsmith

+0

あなたは循環参照を持っています:Copier.hはCopier.hをインポートするCopyQueue.hをインポートします。この場合、あなたは正しいです:forward @class宣言を使用する必要があります。 #import CopyQueue.hは、@ class CopyQueue行でヘッダーから削除できます。 –

関連する問題