#include circulaires

abubu38 Messages postés 2 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 12 juillet 2003 - 12 juil. 2003 à 15:03
abubu38 Messages postés 2 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 12 juillet 2003 - 12 juil. 2003 à 19:15
Salut,

J'ai un gros probleme de compilation au niveau des .h :

fichier f1.h :
  #include f2.h
  class A {

      // définition nécéssitant la classe B... qui hérite de A

  };


fichier f2.h :
  #include f1.h

  class B : public A {

      //blahblah

  };


Ces 2 fichiers sont encadres par #indef... #define.......#endif

Le problème est qu'une prédéclaration de la classe A dans le fichier f2 avant la définition de B ne suffit pas puisque B hérite de A, et donc B a besoin de la définition complète de A, qui n'est pas encore chargée au moment du chargement de la classe B...

Quelqu'un a t'il une idee pour compiler ce bordel?

Ne me demande pas pourquoi ce model tordu, il s'agit en fait d'une petite partie simplifiée d'une structure de données assez complexe...

2 réponses

ADPro22 Messages postés 126 Date d'inscription mercredi 18 juillet 2001 Statut Membre Dernière intervention 27 octobre 2004
12 juil. 2003 à 16:44
Salut,

Le problème ne vient pas de l'inclusion circulaire mais de l'appel circulaire.

Si les classes A et B s'appellent mutuellement dans un fichier header, il faut déclarer comme suit :

class B; // éxistence d'une classe B !

class A {
   B ...
   ...
};

class B {
   ...
   ...
};


donc, dans ton cas,
il suffit d'ajouter un "class B;" dans f2.h avant la déclaration de A*

Cordialement,

ADPro22
0
abubu38 Messages postés 2 Date d'inscription samedi 12 juillet 2003 Statut Membre Dernière intervention 12 juillet 2003
12 juil. 2003 à 19:15
Oui, si le tout est dans un seul et même fichier, c'est simple...

Le probleme est que ce fichier f1.h où se situe la classe de base A inclut un fichier a1 qui inclut un fichier a2, qui inclut un fichier a3 [...] qui inclut ce fameux fichier f2 ou est déclaré et défini le fichier f2...

Avec, 90 classes, je ne peux pas tout mettre dans un seul et même fichier!

En fait le problème viens du fait que, dans f1.h, le #include "f2.h" est avant la définition de la classe A...

En mettant ce le #include "f2.h" après la définition de A, ça compile en déclarant B en tête du fichier, c'est à dire, pour le fichier f1 :

<code>#ifndef __HEADER_1__
#define __HEADER_1__

class B;

class A {
//...
public:
B f();
//...
};

#include "f2.h"

#endif
[\Code]

Mais n'y a t'il pas d'autre méthode, avec des #pragma par exemple (comme en Ada avec Pragma Elaborate_All) qui permettrait de garder tous les includes en tête du fichier... ce serait plus propre, plus lisble et mieux debugable par d'autres qui passeraient après...

Merci
Merci
0
Rejoignez-nous