inclusion cyclique - C++ - Programmation
Marsh Posté le 17-08-2009 à 11:51:47
euh o_O c'ets que ton design est foireux. Montres du code.
Marsh Posté le 17-08-2009 à 13:18:46
Glock 17Pro a écrit : Salut, |
Impossible, sinon ça veut dire que A contient un B et que B contient un A.
Marsh Posté le 17-08-2009 à 13:19:51
Dans tous les cas, passer de la composition à l'agrégation résout le problème (sauf héritage).
Marsh Posté le 18-08-2009 à 21:13:15
Taz a écrit :
|
ma config:
A.h qui include B.H
C.h qui include A.h
B.h qui include C.h
A : singleton, "moteur/main" de l'appli , stocke la structure de donnée, B , en donnée membre
B : structure de Donnée+fonctions associées, à besoin d'un mutex
C : class Mutex, à besoin des fonctions du moteur, notament pour accéder une classe de log, donnée membre du moteur
A, C , B ont des fonctions soit inlines soit templates, donc forward declaration banned
Marsh Posté le 18-08-2009 à 23:17:22
Citation :
|
En quelle honneur ?
Marsh Posté le 19-08-2009 à 07:58:52
- forward declaration , j'y es pas accés, puisque j'utilise les objets dans le .h,donc impossible de déclarer les objets incriminer sous forme de pointeur, et de les utiliser en faisant l'include qui va bien dans le .cpp
- inline parceque j'ai beaucoup de fonctions assez courtes, et que les perf sont recherchées dans cette appli (j'ai conscience que de me baser uniquement sur la taille de la fonction et sa fréquence d'appel pour me décider à la mettre inline est sous optimal , mais je ne sais pas comment faire mieux .. pour l'instant )
- template parceque ça me parait un design plus élaborer
Marsh Posté le 19-08-2009 à 08:52:29
Tu peut quand meme forward declarer tes classes hein
Ca n'a aucun rapprot avec tes contraintes.
Marsh Posté le 19-08-2009 à 09:01:16
deja ton moteur singleton, ca sent le caca a 10km. Decouples tes elements et construit un moteur avec des ptr vers ses sous-elements.
Marsh Posté le 19-08-2009 à 09:13:06
Joel F a écrit : deja ton moteur singleton, ca sent le caca a 10km. |
je suis arrivé à ce design assez naturellement, et avec le recul je m'apperçois que ça ressemble in finé au modèle des MFC avec leur theApp. Et je suis pas convaincu que ça soit cette partie des MFC qu'on critique.
Marsh Posté le 19-08-2009 à 09:14:31
Joel F a écrit : Tu peut quand meme forward declarer tes classes hein |
tu peux préciser stp, moi je pensais que le fait de faire
- class A;
au lieu de
- #include "A.h"
me limiter juste à une déclaration sous forme de pointeur
class B{
A * a;
};
mais pas
class b{
A a;
};
Marsh Posté le 19-08-2009 à 09:55:24
Glock 17Pro a écrit : |
Si
Les singletons c'ets bien pr brille en société, en vrai ca sert jamais à rien à part à te faire ecrire du code moche, monolothique, peu scindbale, qui fait que ton applic ompile en 10 siecles et qui pose des problemes d'ordres d'initialisations.
Bref le singleton, oublie quoi.
Marsh Posté le 19-08-2009 à 09:58:08
Glock 17Pro a écrit : |
Oui moi je parlais de tes fonctions.
Sinon, la forme A* est bien mieux que A.
toujours composer et pas aggreger
Marsh Posté le 19-08-2009 à 10:09:12
Joel F a écrit : |
Mais du coup comment faire pour m'en sortir ? Là ça marche , mais j'aurais voulu que ma class mutex puisse tracer dans un log le nom du thread locké ainsi que le nom de l'objet que le mutex lock...pour ça j'ai besoin de faire les include/template explicité plus haut
Le coup du singleton ok j'y penserais pour la prochaine appli mais là aprés 3 mois de dev, je peux clairement pas faire machine arrière.
Marsh Posté le 19-08-2009 à 10:28:30
Glock 17Pro a écrit : |
T'es coincé, faut cassé.
Marsh Posté le 19-08-2009 à 10:36:44
je comprends même pas pourquoi ça marche pas avec #ifndef en début de fichier ça devrait stoper les problèlmes !?
Marsh Posté le 19-08-2009 à 11:16:30
le pb ets pas la le pb est que tu a besoin dans chaque fichier de connaitre l'ensemble de l'objet de l'autre fichier car tu aggrege au lieu de composer.
Marsh Posté le 19-08-2009 à 11:48:56
Oui mais meme avec de la composition, dans les fonctions inline et/ou template j'utilise le pointeur, et donc la totalité de l'objet à besoin d'être connu..donc le problème persiste
Marsh Posté le 19-08-2009 à 11:51:19
Je m'incruste pour un petite question.
Pour moi l'agrégation a toujours été l'utilisation du pointeur: Quand on détruit un train on ne détruit pas les contrôleurs (sauf dans un accident). Bien que des fois on se dit que l'on devrait. Bref: Controleur* c; selon moi
La composition c'est l'inverse: quand on détruit un train on détruit aussi les sièges: Siege s;
Me suis-je toujours planté? Je me pose des questions quand je vois deux personne dire l'inverse de ce que je pense.
Merci.
Marsh Posté le 19-08-2009 à 11:54:31
euh réflexion faite moi je pense que aggrégation et composition désigne la même chose , c'est à dire pas de pointeur et que l'association désigne un lien par pointeur
Marsh Posté le 19-08-2009 à 11:59:28
Code :
|
Il y a une association entre Lapin et ChampDeCarottes pourtant aucune agrégation ni composition.
Marsh Posté le 19-08-2009 à 12:06:38
Non. Agrégation ou composition, l'élément fait partie de la classe. Un lapin ne possède pas de champ de carottes mais interagit avec => association.
Un train est composé de wagons => il y a un attribut wagon(s) dans la classe train.
Marsh Posté le 19-08-2009 à 12:11:27
Glock 17Pro a écrit : Oui mais meme avec de la composition, dans les fonctions inline et/ou template j'utilise le pointeur, et donc la totalité de l'objet à besoin d'être connu..donc le problème persiste |
Je ne vois pas pourquoi. Tu peux forwarder tes inline, et tu n'es pas obligé de définir tes templates inline.
Si t'es bloqué, c'est que tu as une composition cyclique.
Si t'es capable de le faire sans inline, alors tu peux le faire avec inline.
Marsh Posté le 19-08-2009 à 12:31:43
ptitchep a écrit : Non. Agrégation ou composition, l'élément fait partie de la classe. Un lapin ne possède pas de champ de carottes mais interagit avec => association. |
Mon clavier à du fourcher:
composition : A contient un B
aggregation : A contient un B*
http://www.allinterview.com/showanswers/68362.html
Marsh Posté le 19-08-2009 à 13:01:46
Taz a écrit : |
ça se fait comment le forwade d'inline ?
Oui mais sans être obligé d'inliner mes templates, je dois nécéssaireemnt les définir dans le .h, d'où la nécéssité de connaitre l'objet entièrement
Marsh Posté le 19-08-2009 à 13:17:10
Glock 17Pro a écrit : |
Pourquoi?
Joel F a écrit : |
Merci.
Marsh Posté le 19-08-2009 à 13:26:39
ReplyMarsh Posté le 19-08-2009 à 13:53:39
export ça sert à mettre le corps des fonctions dans un autre fichier? Si c'est ça je ne vois pas le problème. Moi je mets le contenu des méthodes dans xxx.impl.hpp et je l'inclue quand il faut. C'est peut-être pas le mieux (je ne sais pas) mais c'est comme ça que j'ai appris et ça fonctionne.
Marsh Posté le 19-08-2009 à 13:56:20
tu te rends compte que ça revient exactement au même que de tout mettre dans le .h qui définit ta classe ?
Marsh Posté le 19-08-2009 à 14:30:40
Non car tu n'a alors qu'a inclure le impl.
Boost fait ça tt le temps.
Marsh Posté le 19-08-2009 à 14:55:16
bah...ça change rien fondamentalement, ça toblige dés lors que ta classe est template, à faire include "A.h" et non class A;
Marsh Posté le 19-08-2009 à 15:41:28
Glock 17Pro a écrit : bah...ça change rien fondamentalement, ça toblige dés lors que ta classe est template, à faire include "A.h" et non class A; |
Non t'es pas obligé. Tu peux très bien la forwarder.
Marsh Posté le 19-08-2009 à 16:39:03
Oui mais dans ta classe template, tu peux pas utiliser les include que tu fais sous la forme forward
Oui :
#include "B.h"
template<class T>class A{};
Non :
class B;
template<class T>class A{};
Marsh Posté le 19-08-2009 à 16:47:32
Pourquoi non ? T'utilises pas B, on comprend rien.
Template ou pas, ça ne change strictement rien.
Marsh Posté le 19-08-2009 à 17:33:10
Si, j'utilise B dans la classe A :
Code :
|
ci-dessous c'était un exemple incomplet mais je sous-entendais que c'était utilisé comme le code ci-dessus
Code :
|
Marsh Posté le 19-08-2009 à 18:00:22
Glock 17Pro a écrit : Si, j'utilise B dans la classe A :
|
suffit de forwarder et de comprendre que template ou pas, la déclaration et la définition sont deux choses différentes.
Marsh Posté le 19-08-2009 à 18:02:09
Si c'est pas clair pour toi, regarde comment tu ferais tout en un seul fichier.
Marsh Posté le 17-08-2009 à 11:39:58
Salut,
Pourquoi est ce que dans certains cas, le fait de faire
#ifndef / #define en début de chaque fichier ne suffit pas à éliminer les problèmes include cyclique.
Je suis sur un cas où je ne peux pas faire de déclarations forwards. je me retrouve donc coincé....