Вопрос

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

  • У меня есть класс контроллера, который содержит класс модели.
  • У меня есть класс Scene для захвата действий и взаимодействия с контроллером.
  • У меня есть класс Layer, который взаимодействует с классом Model для вывода состояния Модели.
  • Класс Scene содержит класс Layer исключительно для вывода.
  • Сцены должны содержать слои, как определено платформой Cocos2D.
  • Определенные классы сцен являются производными от класса RootScene, который содержит ссылку на класс контроллера.
  • Определенные классы слоев являются производными от класса RootLayer, который содержит ссылку на класс Model.
  • Контроллер отвечает за создание сцен, а Сцены отвечают за создание Слоев.

Проблема возникает при создании слоя и передаче модели контроллера в Модель слоя (в AScene.m).Я получаю "Запрос на членскую "модель" в чем-то, что не является структурой или объединением".Кастинг не работает, и я в недоумении, как разрешить этим классам общаться друг с другом.Я думаю, что часть проблемы может заключаться в том, что класс Controller содержит класс Model.

Контроллер.h

#import <Foundation/Foundation.h>

@class Model;
@class AScene;

@interface Controller : NSObject {
    Model *Model;
}
@property (nonatomic, retain) Model *Model;
-(void)runScene;

Контроллер.m

#import "Controller.h"

#import "Model.h"
#import "AScene.h"

@implementation Controller

@synthesize Model;

- (void)runScene {
    AScene *newScene = [[AScene alloc] init];
    newScene.controller = self;
}

Корневая сцена.h

#import "cocos2d.h"

@class Controller;

@interface RootScene : Scene {
    Controller *controller;
}
@property (nonatomic, retain) Controller *controller;

@end

Корневая сцена.m

#import "RootScene.h"
#import "Controller.h"

@implementation RootScene

@synthesize controller;

- (id) init {
    self = [super init];
    if (self != nil) {
        //
    }
    return self;
}

- (void) dealloc {
    [controller release];
    [super dealloc];
}

@end

Восхождение.h

#import "RootScene.h"

@class ALayer;
@class Model;

@interface AScene : RootScene {
}

@end

Восхождение.м

#import "AScene.h"
#import "ALayer.h"
#import "Model.h"

@implementation AScene

- (id) init {
    self = [super init];
    if (self != nil) {
        ALayer *newLayer = [ALayer node];
        newLayer.model = controller.Model; // <-- Request for member 'Model' in something not a stucture or union
        [self addChild:statusScreenLayer];
    }
    return self;
}

- (void) dealloc {
    [super dealloc];
}

@end

Укоренитель.h

#import "cocos2d.h"

@class Model;

@interface RootLayer : Layer {
    Model *model;
}
@property (nonatomic, retain) Model *model;

@end

Укоренитель.m

#import "RootLayer.h"

#import "Model.h"

@implementation RootLayer

@synthesize model;

- (id) init {
    self = [super init];
    if (self != nil) {
        //
    }
    return self;
}

- (void) dealloc {
    [model release];
    [super dealloc];
}

@end

АЛайер.ч

#import "RootLayer.h"

@interface ALayer : RootLayer {
}
-(void) draw;

@end

АЛайер.м

#import "ALayer.h"

@implementation ALayer

-(void) draw {
    // draw based on state of the model
}

@end
Это было полезно?

Решение

Ваша реализация AScene не делает #import заголовок из Controller.

Редактировать: Явное решение.

В AScene.m добавить:

#import "Controller.h"

Другие советы

Николай, похоже, прав.Помимо этого, наилучшая практика диктует, что свойства (например, ivars) НЕ должны начинаться с заглавной буквы.Ты просто напрашиваешься на боль.Используйте их вместо этого:

Контроллер.h

@interface Controller : NSObject {
    Model *model;
}
@property (nonatomic, retain) Model *model;

Контроллер.m

@synthesize model;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top