[C++] #include -> Type inconnu

#include -> Type inconnu [C++] - C++ - Programmation

Marsh Posté le 30-06-2010 à 16:54:37    

Bonjour a tous,
 
Je suis actuellement en train de bosser sur un mini Worms en interface console, je travaille sous C++ Builder 2009 et j'ai un soucis.
 
Pour expliquer mon problème je vais utiliser 3 fichiers (CA.h, CB.h et CC.h), ceux-ci contiennent chacun 1 classe (CA pour CA.h, CB pour CB.h, etc..).
 
Dans CA.h, j'ai tapé #include "CB.h"
CB.h, j'ai tapé #include "CC.h"
CC.h, j'ai tapé #inclide "CA.h"
 
Et final, CA.h inclut CB.h, CB.h inclut CC.h et CC.h inclut CA.h.
 
http://lh4.ggpht.com/_mH25OtRV0n0/TCtZqumOy_I/AAAAAAAAAEU/yIzScoA-PiU/Sans%20titre.jpg
 
Dans la classe CA, je souhaite créer une variable nommée attribut du type CB or Builder me dit qu'il ne connais pas ce type. Pourtant CA.h inclut CB.h donc le type CB devrait être connu.
 
Evidemment j'ai compris que mon erreur été d'avoir inclut des fichiers entre eux et cela finissait par former une "boucle d'inclusion" (je ne sais pas si c'est le terme approprié). Mais j'ai besoin de garder ce fonctionnement entre les fichiers/classes.
 
 
Donc ma question est : Est-il possible d'inclure les fichiers en "boucle d'inclusion" sans rencontrer ce problème ? Peut-être il faut rajouter un mot-clef que je ne connaisse pas ?
 
 
Vos lumières me serais d'un grand secours merci :jap:  
 
 


---------------
Coz every girl crazy bout a sharp dressed man
Reply

Marsh Posté le 30-06-2010 à 16:54:37   

Reply

Marsh Posté le 30-06-2010 à 18:28:55    

C'est une dépendance cyclique, il te faut déclarer l'existence des classes avant de les utiliser (le linker résoudra le problème à la fin). Un petit class CA; par exemple dans CC.h (enfin je pense).


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 30-06-2010 à 18:52:57    

Merci de m'aider, ça a résolut mon problème :) MAIS mis en évidence un autre :
 
 
http://lh4.ggpht.com/_mH25OtRV0n0/TCt0wvC2JSI/AAAAAAAAAEk/vy4LuwgqBFw/Sans%20titre.jpg
 
 
Ici CM.h inclue CA.h, et CC est dérivée de CM.
CC.h n'inclut pas CA.h.
Je n'ai aucun attribut dans la classe CC.
 
 
Le soucis est le même sauf qu'il se trouve au niveau de la classe CC.  
C'est a dire : "type inconnu" mais ici l'erreur se trouve après le morceau de code correspondant à l'héritage.
 
Ici je sèche, j'ai tenté de rajouter "class CM;" avant la déclaration de CC mais rien n'a changé.
 
Une idée ?


---------------
Coz every girl crazy bout a sharp dressed man
Reply

Marsh Posté le 30-06-2010 à 19:54:35    

dépendances cycliques = code mal découplé = code mal désigné.
 
Es tu tu sur d'avoir besoin de ces spaghetties ?

Reply

Marsh Posté le 30-06-2010 à 20:52:44    

Des dépendances circulaires ça arrive suffisamment souvent pour qu'à cette seule indication déclarer le code mal conçu me semble excessif.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-06-2010 à 20:53:53    

je suis pas de ton avis. Y a vraiment très peu de cas ou la dépendance ne peut etre brisée par une forward.

Reply

Marsh Posté le 01-07-2010 à 08:52:09    

Joel F a écrit :

je suis pas de ton avis. Y a vraiment très peu de cas ou la dépendance ne peut etre brisée par une forward.

 

Ah... nous avons l'air d'etre d'accord sur le fond. Mettre une definition quand une declaration suffit n'est pas pour moi un probleme de conception, juste d'organisation du code.  Tout comme ne pas mettre la definition de membres inline dans la classe mais en dehors.

 

Je ne vois guere qu'avoir un membre d'un type template qui pourrait poser des problemes necessitant le code plus en profondeur.  Et je ne suis pas sur qu'il y ait des cas ou il faut changer la conception plutot que l'expression de cette conception.


Message édité par Un Programmeur le 01-07-2010 à 09:01:13

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 01-07-2010 à 09:00:07    

Xtrmboss a écrit :

Merci de m'aider, ça a résolut mon problème :) MAIS mis en évidence un autre :
 
 
http://lh4.ggpht.com/_mH25OtRV0n0/ [...] 0titre.jpg
 
 
Ici CM.h inclue CA.h, et CC est dérivée de CM.
CC.h n'inclut pas CA.h.
Je n'ai aucun attribut dans la classe CC.


 
Il ne faut fournir la definition plutot qu'une declaration que si c'est necessaire, cad que si la classe herite ou a un membre d'autre classe.  Avoir un membre qui est un pointeur vers l'autre classe ne demande que la declaration.
 
En general, l'aggregration d'UML est implementee avec des pointeurs et pas des membres directement (qui sont mieux representes en UML par la composition, mais on peut avoir des raisons d'implementer une composition par un pointeur), donc dans ton diagramme le seul cas ou tu as besoin d'avoir une definition, c'est CC qui a besoin de la definition de CM, CM peut se contenter d'une declaration de CA, CA de CB, CB de CC.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 01-07-2010 à 09:00:57    

ouais je me susi mal exprimé. Je pensais aussi au gens qui passe font des agrégations cycliques ou passe des trucs par valeurs au lieu d'utilsiez pointeur ou référence.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed