Pergunta

Eu não sou um idiota, mas arquivos de cabeçalho me faz sentir como um às vezes. Eu tenho o que é provavelmente um set-up excessivamente complicado que tem um erro que eu não posso resolver. Aqui está em tão simples como detalhes como eu posso fazer isso ....

  • Eu tenho uma classe de controlador que contém uma classe Model.
  • Eu tenho uma classe cenas a ações de captura e comunica com o controlador.
  • Eu tenho uma classe Camada que as negociações com a classe modelo para a saída do estado do modelo.
  • A classe Scene contém classe Camada exclusivamente para saída.
  • Cenas deve manter Layers como determinado pela estrutura Cocos2D.
  • aulas cena específica derivar de uma classe RootScene que mantém a referência à classe Controller.
  • aulas camada específica derivar de uma classe RootLayer que mantém a referência à classe Model.
  • O controlador é responsável por criar cenas e cenas são responsáveis ??por criar Layers.

O problema surge quando fizer uma camada e passando Modelo do Controlador de Modelo do Layer (em AScene.m). Recebo o "Pedido de membro do 'Modelo' em algo que não é um stucture ou união". Fundição não funcionar, e eu estou em uma perda para saber como permitir que essas classes para falar uns com os outros. Eu acho que parte do problema pode ser que classe Controller contém a classe Model.

Controller.h

#import <Foundation/Foundation.h>

@class Model;
@class AScene;

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

Controller.m

#import "Controller.h"

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

@implementation Controller

@synthesize Model;

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

RootScene.h

#import "cocos2d.h"

@class Controller;

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

@end

RootScene.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

AScene.h

#import "RootScene.h"

@class ALayer;
@class Model;

@interface AScene : RootScene {
}

@end

AScene.m

#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

RootLayer.h

#import "cocos2d.h"

@class Model;

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

@end

RootLayer.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

ALayer.h

#import "RootLayer.h"

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

@end

ALayer.m

#import "ALayer.h"

@implementation ALayer

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

@end
Foi útil?

Solução

A implementação de AScene não #import o cabeçalho de Controller.

Editar:. solução explícita

Em AScene.m add:

#import "Controller.h"

Outras dicas

Nikolai parece estar certo. Além disso, a melhor prática ditaria que as propriedades (como ivars) não deve começar com uma letra maiúscula. Você está apenas pedindo para ter magoado. Use-os em vez disso:

Controller.h

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

Controller.m

@synthesize model;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top