C++ - Boucle infini d'include - C++ - Programmation
Marsh Posté le 12-02-2013 à 14:09:43
Bonjour !
Ce genre de problème se résout toujours de la même façon : Dans un fichier ".h", ne faites un #include que si c'est nécessaire, ce qui revient à peu près à dire que la classe décrite dans le fichier a un attribut qui est une instance (pas une référence, pas un pointeur) d'un type déclaré dans le fichier à inclure, ou qu'elle en dérive.
La plupart du temps (attribut de type "pointeur", ...), vous pouvez vous contenter d'une déclaration simple "class Toto;" au lieu de " #include "Toto.h" "
Dans les .cpp, par contre, vous devrez rajouter tous les #include correspondant à vos "class XXX", mais cela ne pose pas de souci.
Cela permet en général de résoudre plus de 99% des problèmes, et le reste du temps, c'est souvent dû à une mauvaise conception ...
Marsh Posté le 12-02-2013 à 14:32:52
Le problème c'est qu'avec les Packages, class ne fonctionne plus. Alors pour avoir accès à des classes dans le même package Class marche très bien mais là mon problème c'est des include entre deux couches.
Marsh Posté le 12-02-2013 à 15:44:15
Si, cela marche avec les namespaces, c'est juste un peu plus compliqué, la classe XX::YY se prédéclare ainsi :
namespace XX
{
class YY;
}
Marsh Posté le 13-02-2013 à 11:48:29
Il faut mettre des include guards pour tes .h :
Exemple pour Monfichier.h
Code :
|
Fais gaffe aux inclusions circulaires aussi :
http://forum.hardware.fr/hfr/Progr [...] 8555_1.htm
Marsh Posté le 12-02-2013 à 13:37:24
Bonjour,
Je suis actuellement en projet de deuxième année de BTS informatique où nous devons faire un logiciel en C++ sous QT. Je précise dès le départ, car peut-être mon problème vient de ma manière de pensée, j'apprécie bien plus le java au C++ (Mais bon on choisit pas son projet, on fait avec ^^" ). Nous programmons en n-tiers (ici notre niveau nous impose la version simplifiée, la 3 couches Client-Métier-Physique) et ici les problèmes commencent étant donnés que le C++ ne connait pas les packages comme en java. Et pour finir nous utilisons aussi le design patterns Factory (très agréable à utiliser en C++ sachant que les interfaces n'existent pas et qu'il est possible de faire des héritages privés ^^" ) et donc voici en gros la chose par étape :
Couche Client :
-Notre IHM.h include la MetierFactory pour avoir accès aux Implémentation des services Métier. Et on crée des pointeur de ses objets ( EXEMPLE : CapteurService * capteurServiceImpl
-Dans le .cpp on utilise ses objets (après les avoir au préalable déclarer dans le constructeur et préparer la destruction dans le destructeur) pour appeler des fonctions quelconque appartenant à ceux-ci.
Couche Metier :
-Restons avec l'exemple de CapteurServiceImpl. Dans le CapteurServiceImpl.h j'include la PhysiqueFactory pour avoir accès aux Implémentation des services Physique (Ici CapteurDataServiceImpl).
-Dans le .cpp je fais la même chose qu'avant. Appel de fonction donc.
Couche Physique :
-Je fais enfin ce que les fonctions appeler sont censées faire sur les composants.
Alors le problème ne vient pas de là, même si s'en ai partiellement la cause. Ce découpage en couche et ces includes me donne un schéma très simplifié de ce style :
Par la suite j'utilise une fonction du nom de connect :
connect(objet1,SIGNAL(monSignal()),objet2,SLOT(monSlot()))
Et nous voici au problème suivant :
Ce connect se trouve dans une Impl en Physique et si les deux premiers paramètres sont simples a avoir les deux autres je n'ai absolument pas trouvé comment les avoir sans faire une boucle d'include ou faire un truc très moche, je m'explique.
Le connect de mon Impl en Physique doit renvoyé à celle en Métier du même nom (CapteurDataServiceImpl à CapteurServiceImpl en gros, donc il faut que CapteurDataServiceImpl ai un include de la seconde). Le problème est que CapteurServiceImpl a un include de la Physique Factory qui a elle même une include de CapteurDataServiceImpl ... BONJOUR LA BOUCLE. En gros cela donne ça :
Alors au début j'ai essayer toute les méthodes les moins crades possibles comme les namespaces (mais les packages gênes) ou alors d'éssayer d'includer d'autres classes ... Mais rien à faire ça marche pas et je sait plus quoi faire. Je peut à la limite faire une autre classe qui servira à recevoir le connect et qui ne servira qu'à ça (donc aucune connection avec les factory) mais je trouve ça très très moche donc pour un projet d'une entreprise ...