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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Eviter les .h dans les .h

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Eviter les .h dans les .h

n°2345730
Bravado
Posté le 07-02-2020 à 10:19:13  profilanswer
 

Salut à tous,
 
Je me pose une question un peu bête.
Je fais du C++ depuis des années, et j'ai toujours pris soin d'éviter d'inclure des .h dans d'autres .h. Quand on utilise des pointeurs, c'est OK, il suffit de faire :
 

Code :
  1. // Tata.h
  2. class Toto;
  3. class Tata
  4. {
  5.   Toto * m_Toto;
  6. }


 
Ensuite, on inclue Toto.h dans Tata.cpp, et ca roule. Mais si je veux éviter un pointeur, existe-t-il une solution sans inclure le .h ? Exemple :
 

Code :
  1. // Tata.h
  2. // Je veux éviter : #include "Toto.h" içi
  3. class Tata
  4. {
  5.   Toto m_Toto;
  6. }


 
Voilà, merci :)
 
Edit : Je cherche à rendre certains choses plus clean dans mes projets. Je suis même pas certain que ce soit possible de faire ca sans #include, mais je demande quand même :)


Message édité par Bravado le 07-02-2020 à 10:20:42
mood
Publicité
Posté le 07-02-2020 à 10:19:13  profilanswer
 

n°2345751
rat de com​bat
attention rongeur méchant!
Posté le 07-02-2020 à 17:08:37  profilanswer
 

Je ne comprends pas ton problème. POURQUOI tu veux éviter de mettre des .h dans des .h? A mon avis c'est la bonne solution, en prenant soin de mettre des include-guards (#ifndef HEADER #define HEADER ... #endif ou #pragma once).

n°2345757
rufo
Pas me confondre avec Lycos!
Posté le 07-02-2020 à 17:35:00  profilanswer
 

Pareil, j'ai pas trop compris le problème. Effectivement, pour pas avoir des problématique de multi-include du même .h, il faut protéger avec les #ifndef et autres joyeusetés (pb qu'on a souvent pas dans d'autres langages au passage).
En PHP, tu fais un include_once() ou require_once() et t'es tranquille. :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2345782
Bravado
Posté le 07-02-2020 à 23:23:37  profilanswer
 

Et bien j'avoue que je ne sais pas trop... Ça fait partie des règles de mon taf. Enfin plutôt bonnes pratiques. C'est une histoire d'optimisation de ce que j'ai compris, et depuis j'ai toujours limité, en utilisant des pointeurs, des New et de delete.

 

Donc en soit, ça ne sert à rien de s'en priver au final ?

n°2345785
rufo
Pas me confondre avec Lycos!
Posté le 08-02-2020 à 10:09:16  profilanswer
 

Faudrait demander à "Joel F" qui maîtrise bien le sujet.


Message édité par rufo le 08-02-2020 à 10:23:07

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2345865
Farian
Posté le 10-02-2020 à 10:28:19  profilanswer
 

Bonjour !
 
Pour avoir eu le problème sur un projet relativement conséquent, dans lequel il y avait beaucoup trop d'includes dans des .h, le problème est que la modification d'un fichier .h peut impliquer la recompilation de la moitié du projet, à cause des dépendances induites par ces inclusions, même si, au final, elles ne sont pas nécessaires.
 
J'avais, à l'époque, pris 2 jours pour nettoyer à peu près tous les includes "problématiques", c'est à dire ceux d'autres classes du projet, pas ceux d'un framework, par exemple (qui ne changent jamais), et le gain en recompilation du projet était vraiment appréciable lors de la modification de certaines classes assez centrales. Et je ne parle pas de gagner 10 secondes sur une minute :)
 
Après, il est régulièrement nécessaire d'inclure des .h dans d'autres .h, comme dans l'exemple donné (je pense que c'est dû à la taille de l'objet, que le compilateur a besoin de connaître pour pouvoir utiliser les bons décalages pour accéder aux différents attributs).


Message édité par Farian le 12-02-2020 à 16:07:57

---------------
On n'est jamais très fort pour ce calcul !
n°2345997
kermo
Posté le 11-02-2020 à 17:29:53  profilanswer
 

Bravado a écrit :

Et bien j'avoue que je ne sais pas trop... Ça fait partie des règles de mon taf. Enfin plutôt bonnes pratiques. C'est une histoire d'optimisation de ce que j'ai compris, et depuis j'ai toujours limité, en utilisant des pointeurs, des New et de delete.
 
Donc en soit, ça ne sert à rien de s'en priver au final ?


D'après le créateur du C++ il n'y a rien de pire que des new et des delete. Et certainement pas des headers inclus dans d'autres.
 
Une exception, en cas de dépendance circulaire, par exemple si Toto dépendait lui-même de Tata.
 
Enfin comme dit au-dessus, la bonne pratique est d'inclure dans un fichier (header ou non) seulement ce qui est nécessaire.
Par exemple dans bien des cas le header d'une classe n'a pas besoin d'inclure tout ce dont la classe dépend. Ces fichiers pourront être inclus dans le fichier source de la classe.

n°2393395
Joel F
Real men use unique_ptr
Posté le 16-08-2021 à 10:19:39  profilanswer
 

Bravado a écrit :

Et bien j'avoue que je ne sais pas trop... Ça fait partie des règles de mon taf. Enfin plutôt bonnes pratiques. C'est une histoire d'optimisation de ce que j'ai compris, et depuis j'ai toujours limité, en utilisant des pointeurs, des New et de delete.


 
Si ta boite te demande de faire ça, faut changer de boite. Clairement ils pipent rien à ce qu'il font.

n°2394713
gig-gic
jouic jouic
Posté le 02-09-2021 à 15:13:46  profilanswer
 

Ca s'appelle forward declaration.
C'est pratique pour éviter trop de dépendances entre fichiers.
 
Dans le premier exemple, si Toto.h change, Tata.h lui ne changera pas et n'impliquera pas la recompilation d'un éventuel Tata.cpp.
 
Dans ce cas là, "class Toto" est de type incomplet, ce qui est OK pour un pointeur.
 
Par contre, lorsque tu déclares une variable et non un pointeur, ton type doit être complet.
 
Plus d'info : https://stackoverflow.com/a/553869/857620, https://en.wikipedia.org/wiki/Forward_declaration.


Message édité par gig-gic le 02-09-2021 à 15:14:43

---------------
Du lourd !              ----                 omg
n°2394714
gig-gic
jouic jouic
Posté le 02-09-2021 à 15:16:01  profilanswer
 

Pour moi c'est une bonne pratique, on le fait chez nous.
La guideline Google le déconseille par contre.


---------------
Du lourd !              ----                 omg
mood
Publicité
Posté le 02-09-2021 à 15:16:01  profilanswer
 

n°2395158
Joel F
Real men use unique_ptr
Posté le 07-09-2021 à 08:54:52  profilanswer
 

gig-gic a écrit :

Pour moi c'est une bonne pratique, on le fait chez nous.
La guideline Google le déconseille par contre.


 
Les GL Google sont fait pour google. Si les boites arretaient de penser qu'elles ont les pbs de Google, ca serait pas mal.
La seule chose que font le GLG, c'ets niveler par le bas

n°2395211
OdbO
ROC c'est pour les NooBs !!!
Posté le 07-09-2021 à 15:25:25  profilanswer
 

Après tu peux avoir plusieurs déclaration de classes dans un .h


---------------
L'informatique ça évolue très vite ou pas.

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

  [C++] Eviter les .h dans les .h

 

Sujets relatifs
Besoins de votre avis sur une applicationComment eviter message avertissement
Eviter les quotes quand j'insère du texte dans un tableauEviter le "document expiré"
Eviter toutes cellules pattern (rayures diagonales fines)Script Wheel mouse, éviter les erreur de scroll
Eviter la réinitialisation d'une variable public en cas d'erreurEviter les doublons dans une table
Page précédente : éviter la resoumission[Perl] Eviter les commandes system
Plus de sujets relatifs à : [C++] Eviter les .h dans les .h


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