Objective-C "Не удается найти объявление интерфейса для объекта" - PullRequest
0 голосов
/ 09 марта 2012

Программировал приложение для iOS / target-c / cocos2d.До этого препятствия все шло хорошо ... Должен заметить, что это Objective-C ++, т.е..mm файлы, компилируемые для симулятора iOS 5.0.

По сути, я только пытаюсь разделить интерфейс на подклассы.Ошибка выдается в строке @interface: « Не удается найти объявление интерфейса для GameObject »

#import <Foundation/Foundation.h>
#import "CCSprite.h"
#import "cocos2d.h"
#import "Box2D.h"
#import "GameObject.h"

@interface AvalancheBlock : GameObject
{
}

@end

Вот код для GameObject.h:

#import <UIKit/UIKit.h>
#import "cocos2d.h"
#import "Box2D.h"
#import "b2Body.h"
#import "OhSnowGame.h"


@interface GameObject : CCNode {
@public
    b2Body *body;
    b2BodyDef *bodyDef;
    b2FixtureDef *fixtureDef;
    b2PolygonShape *polygonShape;
    b2CircleShape *circleShape;
    CCSprite *sprite;
    int typeTag;
    bool markedForDestruction;
}

@property (readwrite, assign) b2Body *body;
@property (nonatomic, assign) b2BodyDef *bodyDef;
@property (nonatomic, assign) b2FixtureDef *fixtureDef;
@property (nonatomic, assign) b2PolygonShape *polygonShape;
@property (nonatomic, assign) b2CircleShape *circleShape;
@property (nonatomic, retain) CCSprite *sprite;
@property (readwrite, assign) int typeTag;
@property (readwrite, assign) bool markedForDestruction;
@property (readonly) int type;

-(id) init;
-(void) initBox2D;
-(int) type;

@end

И GameObject.mm:

#import "GameObject.h"

@implementation GameObject

@synthesize body, bodyDef, fixtureDef, polygonShape, circleShape, sprite, type, typeTag, markedForDestruction;

-(id) init {
    if( (self=[super init]) ) {
        [self initBox2D];
        markedForDestruction = NO;
    }
    return self;
}

-(void) initBox2D {
    bodyDef = new b2BodyDef();
    fixtureDef = new b2FixtureDef();

    //Initial fixture settings
    fixtureDef->density = 1.0f;
    fixtureDef->friction = 0.5f;
    fixtureDef->restitution = 0.3f;

    bodyDef->userData = self;
}

-(int) type {
    return 0;
}

@end

Если включен правильный файл ... тогда почему ошибка?Спасибо!

решено: разобрался ... там была круговая ссылка, но ссылка мне все же нужна.Решением было удалить #import "OhSnowGame.h" из GameObject.h и вместо этого добавить директиву: @class OhSnowGame

Узнавать что-то новое каждый день.

ВТОРОЕ ОБНОВЛЕНИЕ: Новый вопрос, но очень связанный.У меня есть OhSnowGame.mm, который включает в себя «AvalancheGrid.h».AvalancheGrid.h включает в себя AvalancheParams.h.В OhSnowGame я ссылаюсь как на AvalancheGrid, так и на AvalancheParams.

Компилятор выдает ошибку компоновщика: «Дублирующий символ AvalancheParams в OhSnowGame.o и AvalancheGrid.o»

Но на самом деле это не так 'Кажется, что есть какая-то круговая ссылка на меня.Если я заменим #import "AvalancheGrid.h" в OhSnowGame.mm на просто @class AvalancheGrid;(а также @class AvalancheParams.h;) тогда он не позволяет мне ссылаться на свойства тех объектов, которые мне нужны, например:

avParams.severity = 3; //nope
avParams->severity = 3; //nope
[avParams setSeverity:3]; //nope (with @property severity exposed and synthesized)

Я не понимаю.Как я могу избежать ошибки компоновщика и при этом получить доступ к этим свойствам?

...