inclusion cyclique

inclusion cyclique - C++ - Programmation

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

Reply

Marsh Posté le 17-08-2009 à 11:39:58   

Reply

Marsh Posté le 17-08-2009 à 11:51:47    

euh o_O c'ets que ton design est foireux. Montres du code.

Reply

Marsh Posté le 17-08-2009 à 13:18:46    

Glock 17Pro a écrit :

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


Impossible, sinon ça veut dire que A contient un B et que B contient un A.

Reply

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


Message édité par Taz le 19-08-2009 à 15:40:53
Reply

Marsh Posté le 18-08-2009 à 21:13:15    

Taz a écrit :


Impossible, sinon ça veut dire que A contient un B et que B contient un A.

 

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


Message édité par Glock 17Pro le 18-08-2009 à 22:04:54
Reply

Marsh Posté le 18-08-2009 à 23:17:22    

Citation :


A, C , B ont des fonctions soit inlines soit templates, donc forward declaration banned


En quelle honneur ?


Message édité par Joel F le 18-08-2009 à 23:17:37
Reply

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


Message édité par Glock 17Pro le 19-08-2009 à 08:13:23
Reply

Marsh Posté le 19-08-2009 à 08:52:29    

Tu peut quand meme forward declarer tes classes hein :o
Ca n'a aucun rapprot avec tes contraintes.

Reply

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.

Reply

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.

Reply

Marsh Posté le 19-08-2009 à 09:13:06   

Reply

Marsh Posté le 19-08-2009 à 09:14:31    

Joel F a écrit :

Tu peut quand meme forward declarer tes classes hein :o
Ca n'a aucun rapprot avec tes contraintes.


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

Message cité 1 fois
Message édité par Glock 17Pro le 19-08-2009 à 09:15:01
Reply

Marsh Posté le 19-08-2009 à 09:55:24    

Glock 17Pro a écrit :


 
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.


 
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.

Reply

Marsh Posté le 19-08-2009 à 09:58:08    

Glock 17Pro a écrit :


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


 
Oui moi je parlais de tes fonctions.
Sinon, la forme A* est bien mieux que A.
 
toujours composer et pas aggreger

Reply

Marsh Posté le 19-08-2009 à 10:09:12    

Joel F a écrit :


 
Oui moi je parlais de tes fonctions.
Sinon, la forme A* est bien mieux que A.
 
toujours composer et pas aggreger


 
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.

Message cité 1 fois
Message édité par Glock 17Pro le 19-08-2009 à 10:09:27
Reply

Marsh Posté le 19-08-2009 à 10:28:30    

Glock 17Pro 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.


T'es coincé, faut cassé.

Reply

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 !?


Message édité par Glock 17Pro le 19-08-2009 à 10:46:12
Reply

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.

Reply

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

Message cité 1 fois
Message édité par Glock 17Pro le 19-08-2009 à 11:49:19
Reply

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.


---------------
deluser --remove-home ptitchep
Reply

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

Reply

Marsh Posté le 19-08-2009 à 11:59:28    

Code :
  1. class Lapin
  2. {
  3.      void allerManger (ChampDeCarottes* c) {poids++; c->supprimerCarottes(1);}
  4.      ...
  5. }


Il y a une association entre Lapin et ChampDeCarottes pourtant aucune agrégation ni composition.


Message édité par ptitchep le 19-08-2009 à 11:59:44

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-08-2009 à 12:01:41    

oui bah c'est ce que j'ai dit

Reply

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.


---------------
deluser --remove-home ptitchep
Reply

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.

Reply

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.
Un train est composé de wagons => il y a un attribut wagon(s) dans la classe train.


Mon clavier à du fourcher:
 
composition : A contient un B
aggregation : A contient un B*
 
http://www.allinterview.com/showanswers/68362.html

Reply

Marsh Posté le 19-08-2009 à 13:01:46    

Taz a écrit :


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.


ç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

Reply

Marsh Posté le 19-08-2009 à 13:17:10    

Glock 17Pro a écrit :


Oui mais sans être obligé d'inliner mes templates, je dois nécéssaireemnt les définir dans le .h

Pourquoi?
 

Joel F a écrit :


Mon clavier à du fourcher:
 
composition : A contient un B
aggregation : A contient un B*
 
http://www.allinterview.com/showanswers/68362.html

Merci.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-08-2009 à 13:26:39    

 
parceque export est pas supporté par la majorité des compilo

Reply

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


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-08-2009 à 13:55:56    

lol ok

Reply

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 ?

Reply

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.

Reply

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;

Reply

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.

Reply

Marsh Posté le 19-08-2009 à 15:57:51    

template<class T> class A; :sarcastic:

Reply

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


Message édité par Glock 17Pro le 19-08-2009 à 16:39:18
Reply

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.

Reply

Marsh Posté le 19-08-2009 à 17:33:10    

Si, j'utilise B dans la classe A :
 

Code :
  1. #include "B.h"
  2. template<class T>class A
  3. {
  4. B * b;
  5. void JutiliseB()
  6. {
  7. b = new B;
  8. b->utiliseMoi();
  9. }
  10. };


 
ci-dessous c'était  un exemple incomplet mais je sous-entendais que c'était utilisé comme le code ci-dessus

Code :
  1. class B;
  2. template<class T>class A{};

Message cité 1 fois
Message édité par Glock 17Pro le 19-08-2009 à 17:35:52
Reply

Marsh Posté le 19-08-2009 à 18:00:22    

Glock 17Pro a écrit :

Si, j'utilise B dans la classe A :

 
Code :
  1. class B;
  2. template<class T>class A
  3. {
  4. B * b;
  5. void JutiliseB();
  6. };
  7. #include "B.h"
  8. template<typename T>
  9. void A<T>::JutiliseB()
  10. { ... }
 


 

suffit de forwarder et de comprendre que template ou pas, la déclaration et la définition sont deux choses différentes.


Message édité par Taz le 19-08-2009 à 18:00:56
Reply

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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