2009-10-04 12 views
10

私は2つのサブクラスを持っています.1つはカスタマイズが多く、Fooは1つのメソッドしかオーバーライドしない別のサブクラスです。追加の変数が必要な場合は、Barとします。1つの.hと.mのObjective-C複数のクラス定義

バーはFooの変数の1つになるので、2つのファイル(Barの場合は.mと.h)を残さないようにするため、Fooの.hと.mファイルにBarを実装して実装したい。

私の最善の努力は、いくつかのコンパイラエラーをもたらします。

#import "Foo.h" 


@implementation Foo 
@synthesize barVariable; 

-(void) fooMethod{ 
    //do foo related things 
} 
@end 

@implementation Bar 
- (void)barSuperClassMethodIWantToOverride{ 
} 
@end 

私は物事のこのタイプは、一般的にひんしゅくを買うことになることを認識し、私はそれが適切だと感じ:.mファイルがどのように見える

#import <UIKit/UIKit.h> 

@interface Foo : FooSuperClass { 
    Bar *barVariable; 
} 

@property (nonatomic, retain) Bar *barVariable; 

-(void) fooMethod; 
@end 

@interface Bar : BarSuperClass { 
} 

@end 

.hファイルは次のようになります私の状況では。私が得る最初のエラーは、 "barの前に予期される指定子 - 修飾子リスト"です。

私は間違っていますが、1つのファイルに複数の宣言/定義を入れることは可能でしょうか。

答えて

9

ヘッダには、宣言する前にBarを使用しています。解決策:Fooの前にBarの定義を入れてください。

+9

'@ class'指示文を使うほうがよい場合がよくあります。たとえば、 'Foo'型のインスタンス変数が' Bar'で宣言されているとどうなりますか? –

25

コンパイラは、以前に見たタイプの有効なものだけを考慮します。 Nikolaiが言及したように、Fooの前にBarを宣言することができます。

ただし、必ずしもそうであるとは限りません。他の状況の場合は、@classを使用してクラスの前方宣言を行うことができます。

I.e.

@class Bar; 
@interface Foo : NSObject 
{ 
    Bar *bar; 
} 
@end 

@class Bar;バーとバーへのポインタという名前のクラスが有効と見なされるべきであるが存在することをコンパイラに指示します。

関連する問題