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

  FORUM HardWare.fr
  Programmation
  C++

  inclusion cyclique

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

inclusion cyclique

n°1915666
Glock 17Pr​o
Posté le 17-08-2009 à 11:39:58  profilanswer
 

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

mood
Publicité
Posté le 17-08-2009 à 11:39:58  profilanswer
 

n°1915675
Joel F
Real men use unique_ptr
Posté le 17-08-2009 à 11:51:47  profilanswer
 

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

n°1915708
Taz
bisounours-codeur
Posté le 17-08-2009 à 13:18:46  profilanswer
 

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.

n°1915709
Taz
bisounours-codeur
Posté le 17-08-2009 à 13:19:51  profilanswer
 

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
n°1916318
Glock 17Pr​o
Posté le 18-08-2009 à 21:13:15  profilanswer
 

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
n°1916360
Joel F
Real men use unique_ptr
Posté le 18-08-2009 à 23:17:22  profilanswer
 

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
n°1916393
Glock 17Pr​o
Posté le 19-08-2009 à 07:58:52  profilanswer
 

- 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
n°1916404
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 08:52:29  profilanswer
 

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

n°1916409
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 09:01:16  profilanswer
 

deja ton moteur singleton, ca sent le caca a 10km. Decouples tes elements et construit un moteur avec des ptr vers ses sous-elements.

n°1916418
Glock 17Pr​o
Posté le 19-08-2009 à 09:13:06  profilanswer
 

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.

mood
Publicité
Posté le 19-08-2009 à 09:13:06  profilanswer
 

n°1916419
Glock 17Pr​o
Posté le 19-08-2009 à 09:14:31  profilanswer
 

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
n°1916432
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 09:55:24  profilanswer
 

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.

n°1916436
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 09:58:08  profilanswer
 

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

n°1916446
Glock 17Pr​o
Posté le 19-08-2009 à 10:09:12  profilanswer
 

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
n°1916453
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 10:28:30  profilanswer
 

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

n°1916459
Glock 17Pr​o
Posté le 19-08-2009 à 10:36:44  profilanswer
 

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
n°1916506
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 11:16:30  profilanswer
 

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.

n°1916551
Glock 17Pr​o
Posté le 19-08-2009 à 11:48:56  profilanswer
 

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
n°1916555
ptitchep
Posté le 19-08-2009 à 11:51:19  profilanswer
 

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
n°1916559
Glock 17Pr​o
Posté le 19-08-2009 à 11:54:31  profilanswer
 

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

n°1916560
ptitchep
Posté le 19-08-2009 à 11:59:28  profilanswer
 

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
n°1916561
Glock 17Pr​o
Posté le 19-08-2009 à 12:01:41  profilanswer
 

oui bah c'est ce que j'ai dit

n°1916564
ptitchep
Posté le 19-08-2009 à 12:06:38  profilanswer
 

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
n°1916567
Taz
bisounours-codeur
Posté le 19-08-2009 à 12:11:27  profilanswer
 

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.

n°1916573
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 12:31:43  profilanswer
 

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

n°1916579
Glock 17Pr​o
Posté le 19-08-2009 à 13:01:46  profilanswer
 

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

n°1916582
ptitchep
Posté le 19-08-2009 à 13:17:10  profilanswer
 

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
n°1916584
Glock 17Pr​o
Posté le 19-08-2009 à 13:26:39  profilanswer
 

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

n°1916598
ptitchep
Posté le 19-08-2009 à 13:53:39  profilanswer
 

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
n°1916603
Glock 17Pr​o
Posté le 19-08-2009 à 13:55:56  profilanswer
 

lol ok

n°1916605
Glock 17Pr​o
Posté le 19-08-2009 à 13:56:20  profilanswer
 

tu te rends compte que ça revient exactement au même que de tout mettre dans le .h qui définit ta classe ?

n°1916625
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 14:30:40  profilanswer
 

Non car tu n'a alors qu'a inclure le impl.
Boost fait ça tt le temps.

n°1916636
Glock 17Pr​o
Posté le 19-08-2009 à 14:55:16  profilanswer
 

bah...ça change rien fondamentalement, ça toblige dés lors que ta classe est template, à faire include "A.h" et non class A;

n°1916685
Taz
bisounours-codeur
Posté le 19-08-2009 à 15:41:28  profilanswer
 

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.

n°1916711
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 15:57:51  profilanswer
 

template<class T> class A; :sarcastic:

n°1916745
Glock 17Pr​o
Posté le 19-08-2009 à 16:39:03  profilanswer
 

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
n°1916757
Taz
bisounours-codeur
Posté le 19-08-2009 à 16:47:32  profilanswer
 

Pourquoi non ? T'utilises pas B, on comprend rien.
Template ou pas, ça ne change strictement rien.

n°1916784
Glock 17Pr​o
Posté le 19-08-2009 à 17:33:10  profilanswer
 

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
n°1916797
Taz
bisounours-codeur
Posté le 19-08-2009 à 18:00:22  profilanswer
 

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
n°1916798
Taz
bisounours-codeur
Posté le 19-08-2009 à 18:02:09  profilanswer
 

Si c'est pas clair pour toi, regarde comment tu ferais tout en un seul fichier.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  inclusion cyclique

 

Sujets relatifs
Problème d'inclusion de psapi.h dans une bibliothèqueInclusion page externe
recherche algo pour optimiser une recherche dans un graphe cycliqueInclusion de resources C/C++
NEED HELP un débutant C# inclusion de classesupprimer un bout de code lors d'une inclusion
Inclusion d'un header automatiqueinclusion multiple
Problème d'inclusion de bibliothèqueinclusion de fichiers de classe ayant le meme nom
Plus de sujets relatifs à : inclusion cyclique


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