I'm making a Cocos2d game for iphone, and I have my main game mode, Game
, which inherits from CCLayer
.
I'm trying to make another game mode, MathGame
, which inherits from Game
, but when I try to compile, I get this error in MathGame.h
:
Attempting to use the forward class 'Game' as superclass of 'MathGame'
I get the error even if the implementation and interface of MathGame
are empty. And it only happens if I try to include MathGame.h
in another file.
Here's the code for the Game class:
// Game.h
#import "cocos2d.h"
#import <GameKit/GameKit.h>
#import "SplashScreenLayer.h"
@interface Game : CCLayer
// A bunch of stuff
@end
The new game type:
// MathGame.h
#import "Game.h"
@interface MathGame : Game
@end
And the main menu that includes both:
// SplashScreen.h
#import "cocos2d.h"
#import "Game.h"
#import "MathGame.h"
#import "HowToPlayLayer.h"
#import "AboutLayer.h"
@interface SplashScreenLayer : CCLayer
// A bunch of stuff
@end
I can't find anything helpful online. Any ideas?
You simply have an import cycle:
Game
imports SplashScreenLayer
SplashScreenLayer
imports MathGame
MathGame
imports Game
Your solution:
Leave the import
inside the MathGame
, and change the other imports to @class.
To sum it up:
// Game.h #import "cocos2d.h" #import <GameKit/GameKit.h> @class SplashScreenLayer; @interface Game : CCLayer // A bunch of stuff @end The new game type: // MathGame.h #import "Game.h" @interface MathGame : Game @end And the main menu that includes both: // SplashScreen.h #import "cocos2d.h" #import "HowToPlayLayer.h" #import "AboutLayer.h" @class Game; @class MathGame; @interface SplashScreenLayer : CCLayer // A bunch of stuff @end
With your question answered above, let me explain a few things I already know from reading about forward declerations and import cycles:
First, go read about them! They are a very important part of Objective-C, and you don't want to miss it!
Secondly, use @class whenever you need that class for private variables or method parameters. Use imports for inheritance and strong properties.
Thirdly, don't forget to #import
your forwarded classes in the implementation file!