Класс реализации: не удается найти суперкласс

У меня есть класс ForceGaugeViewController и класс ForceGaugeController. Я пытаюсь сделать класс ForceGaugeController подклассом ForceGaugeViewController, но получаю сообщения об ошибках.

Ошибка:

Не удается найти объявление интерфейса для суперкласса ForceGaugeViewController класса ForceGaugeController.

ForceGaugeViewController.h

#import <UIKit/UIKit.h>
#import <math.h>
#import "HardwareController.h"
#import "ForceGaugeController.h"

@interface ForceGaugeViewController : UIViewController{
}
end

ForceGaugeViewController.m

#import "ForceGaugeViewController.h"

@implementation ForceGaugeViewController

ForceGaugeController.h

#import <Foundation/Foundation.h>
#import "ForceGaugeViewController.h"
#import "FMDatabase.h"
#import "FMResultSet.h"

@class ForceGaugeViewController;

// error here
@interface ForceGaugeController : ForceGaugeViewController{
}
@end

ForceGaugeController.m

#import "ForceGaugeController.h"

person ilaunchpad    schedule 04.08.2011    source источник


Ответы (4)


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

Изменить: также суперкласс ForceGaugeViewController не должен включать подкласс ForceGaugeViewController в заголовочный файл.

ForceGaugeController.h

#import <Foundation/Foundation.h>
#import "ForceGaugeViewController.h"
#import "FMDatabase.h"
#import "FMResultSet.h"

@interface ForceGaugeController : ForceGaugeViewController{
 }
@end
person Joe    schedule 04.08.2011
comment
Зачем тебе #import "ForceGaugeController.h" в ForceGaugeController.h? - person Mundi; 05.08.2011
comment
Вы не можете ТОЛЬКО предварительно объявить класс, от которого вы наследуете, или протокол, который вы будете реализовывать. Это не является незаконным (хотя и плохим стилем) делать и то, и другое. - person Chris Devereux; 05.08.2011
comment
@Джо, спасибо. Я не заметил, что у меня есть подкласс в заголовочном файле суперкласса. Это сработало. - person ilaunchpad; 05.08.2011
comment
Спасибо за помощь. - person Natasha; 26.06.2016

Избегайте циклического импорта. Убедитесь, что вы не импортируете файлы заголовков или подклассов реализации в файл суперкласса, в котором находится объявление интерфейса суперкласса (файл .h).

person asaf am    schedule 06.12.2014

Вы включаете ForceGaugeController.h в ForceGaugeViewController.h и включаете ForceGaugeViewController.h в ForceGaugeController.h. Круговое включение запутает компилятор, и, вероятно, это неправильно.

Файл заголовка для класса должен включать только структуру (например, UIKit), подкласс и любые протоколы, которым соответствует класс. Форвардные объявления подойдут для классов переменных экземпляра экземпляра/аргументов/свойств метода.

person Chris Devereux    schedule 04.08.2011

Удалите строку:

@class ForceGaugeViewController;

Вы уже импортируете класс ForceGaugeViewController через его заголовочный файл в верхней части файла ForceGaugeController.m.


ИЗМЕНИТЬ 1

И, как указал @Chris Devereux, у вас есть циклическая ссылка в ваших файлах заголовков, вы также захотите избавиться от нее.


ИЗМЕНИТЬ 2

И не уверен, как я пропустил самостоятельный импорт в вашем файле ForceGaugeController.h. Я предполагаю, что это опечатка, но если нет, я уверен, что вы знаете, что вам нужно удалить ее.

person Perception    schedule 04.08.2011