2009-02-27 10 views
0

Je suis vraiment hésité à poser cette question, car il est sûr d'avoir une telle réponse terriblement facile, mais je ne peux pas le comprendre. Ici va:relations dans les classes Objective-C

J'ai ce code Objective-C dans un fichier appelé Copier.h:

#import <Cocoa/Cocoa.h> 
#import "CopyQueue.h"; 


@interface Copier : NSObject { 
    IBOutlet NSTextField *statusField; 
    IBOutlet NSTextField *toField; 
    CopyQueue *queue; 
} 
- (IBAction)startCopy:(id)sender; 
- (void)dropFile:(NSString *)theFileName; 
@end 

Et chaque fois que je tente de compiler mon projet dans Xcode, je reçois une erreur de syntaxe dans la ligne où il est dit CopyQueue *queue; Qu'est-ce que je fais mal?

Le fichier compile quand je change la ligne à id *queue;, mais qui ne peut pas être la solution, peut-il? Remplacer toutes les références typées par des références génériques?

+0

Avez-vous assuré est inclus la définition de CopyQueue? – anand

Répondre

1

Essayez ...

@class CopyQueue 

@interface { 
    ... 
} 

... 

@end 
+0

Génial! Tu es le meilleur :) Je ne sais pas comment je pourrais avoir manqué ça. – winsmith

1

Predeclaring CopyQueue ne devrait pas être nécessaire (le "@class CopyQueue" que David McGraw affiché) que l'affiche a déjà écrit la ligne « #import "CopyQueue.h" ". Peut-être l'inutile ";" après « #import « CopyQueue » est à l'origine des problèmes?

En tout état de cause, assurez-vous que le CopyQueue est déclarée correctement dans le fichier CopyQueue.h (avec la même orthographe et la casse).

+0

CopyQueue.h est, autant que je peux dire, correct. Supprimer le point-virgule après #import "CopyQueue.h" ne change rien cependant. CopyQueue.h doit-il contenir l'instruction @class CopyQueue? – winsmith

0

Ce n'est pas un question idiote du tout. Elle reflète un des aspects les plus complexes de l'utilisation d'un statiquement typé, compilé langage comme C (et Objective-C qui est un C surensemble). Pour les gens venant de langues dynamiquement typés (comme Python, Ruby, PHP, etc Pour que vous puissiez utiliser un type (en C, Objective-C ou C++), vous devez déclarer ce type: CopyQueue est un type, donc il doit être déclaré (en utilisant @interface CopyQueue : SomeClass {} @end). ou implicitement déclaré en utilisant @class CopyQueue. Dans l'exemple que vous avez publié, un programmeur de cacao assumerait que CopyQueue.h contient quelque chose comme ça

@interface CopyQueue : SuperClass { //where SuperClass is the name of the class that CopyQueue inherits from 

    ... 
    } 
... 
@end 

Si ce n'est pas le cas (votre commentaire à Lyndsey Ferguson suggère que ce n'est pas), vous devez inclure l'en-tête fichier qui définit le type de classe CopyQueue (comme ci-dessus) ou indique au compilateur que CopyQueue est une classe (en utilisant @class CopyQueue). La déclaration @class CopyQueue est une façon de dire au compilateur qu'il peut traiter CopyQueue* comme un pointeur vers une classe Objective-C (type id) et que vous allez remplir les détails (tels que les variables d'instance et les méthodes de CopyQueue) via un @interface plus tard (comme dans un module séparé).

+0

Jetez un oeil à la source à http://bitbucket.org/winsmith/copymeister/src/. La définition de CopyQueue est incluse dans le fichier, mais j'ai toujours besoin de la ligne @ class pour le faire fonctionner. (Ce qui est bien pour moi BTW) – winsmith

+0

Vous avez une référence circulaire: les importations Copier.h CopyQueue.h qui importe Copier.h. Dans ce cas, vous avez raison: vous devez utiliser la déclaration forward @class. Vous pouvez supprimer le #import CopyQueue.h de l'en-tête avec la ligne @class CopyQueue. –

Questions connexes