Un truc qui ma dépasse complétement : bug ou pas ???

bluheim

Membre confirmé
29 Octobre 2003
354
16
Voici mon problème, très simple à reproduire :

J'ai un projet composé de deux classes, Classe1 et Classe2, dont voici les définitions :

Classe1.h

#import <Foundation/Foundation.h>
#import "Classe2.h"

@interface Classe1 : NSObject {

}

- (Classe2 *)fonctionQuiRenvoieUnObjectClasse2;

@end

Classe1.m

#import "Classe1.h"


@implementation Classe1

- (Classe2 *)fonctionQuiRenvoieUnObjectClasse2
{
return nil;
}

@end

Classe2.h

#import <Foundation/Foundation.h>
#import "Classe1.h"

@interface Classe2 : NSObject {

}

@end

Classe2.m

#import "Classe2.h"


@implementation Classe2

@end



Rien de bien compliqué n'est-ce pas ? J'ai donc une méthode de la classe Classe1 qui renvoit un objet de classe Classe2. Rien que du très classique...

Hé bien figurez-vous qu'il est impossible de compiler ce projet !

Il y a une erreur de compilation située à la ligne de Classe1.h que j'ai mis en rouge :

error: parse error before "Classe2"

Et un warning situé à la ligne en orange de Classe1.h :

'@end' must appear in an implementation context





Je ne vois pas DU TOUT ce que je fais de mal avec ces deux pauvres ridicules classe et ce projet riquiqui !

Si quelqu'un peut m'éclairer, il aura sauver mon week-end parcequ'en l'état, se retrouver coincé sur des trucs aussi...aberrants, ça donne pas vraiment envie d'aller plus loin.

Au fait, juste pour rigoler un peu, précisons que si on enlève la ligne "#importe Classe1.h" dans Classe2.h, la compilation se passe sans problème...

J'en conclu que je ne suis pas autorisé à avoir besoin de Classe1 dans Classe2 ET de Classe2 dans Classe1. Ca fait peur...


Merci d'avance !
 

Spyro

Vétéran
Club MacG
19 Juillet 2001
5 428
867
40
PNG-sur-Yvette
bluheim a dit:
J'en conclu que je ne suis pas autorisé à avoir besoin de Classe1 dans Classe2 ET de Classe2 dans Classe1. Ca fait peur...
Un rien te fait peur

Un import c'est jamais qu'un include qui évite une erreur si le fichier est déjà visité. Ton truc, là, ça fait une boucle d'include. C'est un classique de tous les langages objet. La solution est toujours la même.

Pour être plus précis ce qu'il fait c'est que:
1 - il lit ton classe2.h
2 - il arrive à l'import, il rentre tout de suite dans classe1.h
3 - il saute l'import de classe2.h car il est déjà dans classe2.h (un include ferait ici une erreur si je ne me trompe)
4 - il arrive à (Classe2 *) et évidemment ça n'a pas encore été défini d'où erreur.

La solution est la suivante:
[*] remplacer un ou tous les import croisés par des déclarations du type: @class la_classe
[*] faire les imports dans les fichiers .m


Allez ça donne par exemple:


Classe1.h

#import <Foundation/Foundation.h>
@class Classe2

@interface Classe1 : NSObject {
}
- (Classe2 *)fonctionQuiRenvoieUnObjectClasse2;
@end

Classe1.m

#import "Classe1.h"
#import "Classe2.h"

@implementation Classe1
- (Classe2 *)fonctionQuiRenvoieUnObjectClasse2
{
return nil;
}
@end

Classe2.h

#import <Foundation/Foundation.h>
@class Classe1

@interface Classe2 : NSObject {
}
@end

Classe2.m

#import "Classe2.h"
#import "Classe1.h"

@implementation Classe2
@end


VOILA
Normalement comme ça c'est bon, modulo le fait qu'il est 3h du mat et que j'ai fait ça rapidement.
 

bluheim

Membre confirmé
29 Octobre 2003
354
16
Un grand merci à toi ! Je n'avais même pas conscience de cette notion de boucle d'include. Je vais tenter d'appliquer ta méthode !

Et oui, je suis un petit peureux...