Многочисленные определения классов Objective-C в одном .h и .m - PullRequest
11 голосов
/ 04 октября 2009

У меня есть два подкласса, один с большим количеством настроек, мы назовем его Foo, а другой подкласс, которому нужен только один переопределенный метод, и не требующий дополнительных переменных, мы назовем его Bar

Bar будет одной из переменных Foo, поэтому чтобы не иметь еще 2 файлов для работы (.m и .h для Bar), я хотел бы связать и реализовать Bar в файлах .h и .m Foo.

Мои лучшие усилия дают мне несколько ошибок компилятора.

Файл .h выглядит так:

#import <UIKit/UIKit.h>

@interface Foo : FooSuperClass {
    Bar *barVariable;
}

@property (nonatomic, retain) Bar *barVariable;

-(void) fooMethod;
@end

@interface Bar : BarSuperClass {
}

@end

Файл .m выглядит так:

#import "Foo.h"


@implementation Foo
@synthesize barVariable;

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

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

Я понимаю, что подобные вещи обычно осуждаются, но я чувствую, что это уместно в моей ситуации. Первая ошибка, которую я получаю, это «ожидаемый список спецификаторов-спецификаторов перед строкой».

Что я сделал не так, я почти уверен, что можно иметь несколько объявлений / определений в одном файле.

Ответы [ 2 ]

27 голосов
/ 04 октября 2009

Компилятор считает только те типы, которые он видел ранее. Как упоминал Николай, вы могли бы объявить Bar до Foo.

Однако это не всегда возможно. В других ситуациях вы можете использовать @class для прямого объявления класса.

1008 * Т.е. *

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

@class Bar; сообщает компилятору, что существует класс с именем Bar и указатели на Bar должны считаться действительными.

9 голосов
/ 04 октября 2009

В своем заголовке вы использовали Bar перед объявлением. Решение: поместите определение Bar перед Foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...