ilaunchpad
ilaunchpad

Reputation: 1313

Implementing class: Cannot find superclass

I have ForceGaugeViewController class and ForceGaugeController class. I'm trying to make the ForceGaugeController class be a subclass of ForceGaugeViewController, but I'm receiving errors.

Error:

Cannot find interface declaration for ForceGaugeViewController superclass of ForceGaugeController class.

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"

Upvotes: 2

Views: 7956

Answers (4)

asaf am
asaf am

Reputation: 1395

Be sure to avoid circular imports: Make sure you do not import any of the header or implementation subclasses files into the superclass file where the superclass interface declaration is (.h file)

Upvotes: 5

Joe
Joe

Reputation: 57169

You can not only forward reference a class that you will inherit from or a protocol that you will implement. You just need to import the superclass in the header which you are already doing and then remove the @class declaration.

Edit: Also the superclass ForceGaugeViewController should not include the subclass ForceGaugeViewController in the header file.

ForceGaugeController.h

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

@interface ForceGaugeController : ForceGaugeViewController{
 }
@end

Upvotes: 8

Perception
Perception

Reputation: 80603

Remove the line:

@class ForceGaugeViewController;

You are already importing the ForceGaugeViewController class via its header file at the top of your ForceGaugeController.m file.


EDIT 1

And as pointed out by @Chris Devereux, you have a circular reference in your header files, you will want to get rid of that as well.


EDIT 2

And not sure how I missed the self-import in your ForceGaugeController.h file. I assume that it's a typo, but if not I'm sure you know you have to remove it.

Upvotes: 0

Chris Devereux
Chris Devereux

Reputation: 5473

You're including ForceGaugeController.h in ForceGaugeViewController.h and including ForceGaugeViewController.h in ForceGaugeController.h. Circular includes will confuse the compiler and that's probably what's wrong.

A header file for a class only needs to include the framework (ie. UIKit), the subclass, and any protocols the class conforms to. Forward declarations will do for the classes of instance instance variables/method arguments/properties.

Upvotes: 1

Related Questions