Inclusion des fichiers d'en-tête / Déclaration d'aval
Dans mon projet C++ quand dois-je utiliser pour l'inclusion (#include "myclass.h"
) des fichiers d'en-tête? Et quand dois-je utiliser avant la déclaration de la classe (class CMyClass;
)?
source d'informationauteur liaK
Vous devez vous connecter pour publier un commentaire.
En règle générale, essayez le avant la déclaration de la première. Cela permettra de réduire les temps de compilation, etc. Si ça ne compile pas aller pour le
#include
. Vous devez aller pour le #include si vous devez effectuer les opérations suivantes:new
/delete
copier, etc.(6,7,8,9 de @Meuglement de Canard)
Ils sont sans doute plus mais je n'ai pas ma langue la loi hat aujourd'hui.
Il y a plusieurs problèmes à l'avant de la déclaration:
En avant les déclarations sont difficile pour les autres de maintenir. Par exemple, si un fichier d'en-tête contient:
plutôt que l'avant de la déclaration de
il est facile pour les autres de trouver l'emplacement de la classe Foo est déclarée. Avec l'avant de la déclaration, il n'est pas que
évident; certains Ide comme Eclipse peut ouvrir la déclaration anticipée lorsque l'utilisateur essaie d'ouvrir
la déclaration d'une variable.
"Could not find file MyProject/MyWidgets/MyFooWidgets/FooUtil/Foo.h"
depuis, alors vous savez où chercher pour le correspondantFoo.cpp
et d'identifier la bibliothèque qui le contient.Si vous pensez que votre version est trop long, puis essayer de faire une compile seulement avec pas de lien. Si votre code ne prend que 10 secondes à compiler et à 10 minutes de lien, le problème n'a rien à voir avec un peu plus de comprend. De même, si votre fichier d'en-tête contient tellement de choses qu'il est en fait à l'origine d'un problème de performances, alors il est probablement temps pour vous de revoir le contenu de ce fichier en plusieurs petits fichiers d'en-tête.
Alors, quand est-il OK pour déclarer avant? Si vous le faites dans le même fichier d'en-tête comme le véritable déclaration.
Exemple:
OU
Si vous avez seulement besoin d'un pointeur vers la classe et vous n'avez pas besoin de tout savoir sur la classe, plutôt que son nom, vous pouvez utiliser la déclaration anticipée.
Comme un débutant, vous devez toujours #inclure les fichiers d'en-tête lorsque vous avez besoin d'utiliser les types ou les fonctions qu'ils contiennent, ne pas essayer de "optimiser" votre construction par l'avant de déclarer des choses - ce n'est presque jamais nécessaire, même sur de grands projets, à condition que le projet est bien conçu.
Le seul moment où vous en avez absolument besoin d'une déclaration anticipée est dans ce genre de situations:
où chaque structure (ou de classe) désigne le type de l'autre. Dans ce cas, vous avez besoin d'une déclaration anticipée de B pour résoudre le problème:
Vous devraient s'efforcer de minimiser votre
#include
s à la fois dans le but de réduire les temps de compilation, mais aussi pour aider à la modularité et la testabilité. @Ypnos dit, classe les contrats à terme sont excellentes quand vous avez seulement besoin de pointeurs.Pour quelques conseils pratiques sur la façon de réduire l'en-tête dépendances, voir, par exemple,cet article.