#include circulaires

Signaler
Messages postés
2
Date d'inscription
samedi 12 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2003
-
Messages postés
2
Date d'inscription
samedi 12 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2003
-
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...
A voir également:

2 réponses

Messages postés
126
Date d'inscription
mercredi 18 juillet 2001
Statut
Membre
Dernière intervention
27 octobre 2004

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
Messages postés
2
Date d'inscription
samedi 12 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2003

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