Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1608 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  C++ - Boucle infini d'include

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C++ - Boucle infini d'include

n°2175363
naavi666
Posté le 12-02-2013 à 13:37:24  profilanswer
 

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 :
 
http://img15.hostingpics.net/pics/194881dfgdfgd.png
 
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 :
 
http://img15.hostingpics.net/pics/348007gdfgdfgdf.png
 
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 ...

mood
Publicité
Posté le 12-02-2013 à 13:37:24  profilanswer
 

n°2175370
Farian
Posté le 12-02-2013 à 14:09:43  profilanswer
 

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 ...

n°2175376
naavi666
Posté le 12-02-2013 à 14:32:52  profilanswer
 

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.

n°2175388
Farian
Posté le 12-02-2013 à 15:44:15  profilanswer
 

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;
}

n°2175501
crom29
Posté le 13-02-2013 à 11:48:29  profilanswer
 

Il faut mettre des include guards pour tes .h :
 
Exemple pour Monfichier.h

Code :
  1. #ifndef INCLUDE_MONFICHIER
  2. #define INCLUDE_MONFICHIER
  3. #include <iostream>
  4. #include "toto.h"
  5. [...]
  6. #endif


 
Fais gaffe aux inclusions circulaires aussi :
http://forum.hardware.fr/hfr/Progr [...] 8555_1.htm
 


---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  C++ - Boucle infini d'include

 

Sujets relatifs
[C#] Winform Binding Controls OracleDataAdapter [Résolu]Programmation C Aides [Résolu]
[resolu] problème compilation programmes C sous Dev-C++[VB/VBA/VBS] Boucle d'une boucle
Chronométrer le temps d'exécution d'une fonction en C et à la µsRealiser un Menu en C
Problème d'include lié à iostream et SNMP++programmation C (Menu)
[C# C++ JAVA] La programmation, un métier d'avenir ? 
Plus de sujets relatifs à : C++ - Boucle infini d'include


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR