51 votes

Organisation des fichiers d'en-tête de classe C ++

Quelles sont les instructions de codage C ++ et d’organisation des fichiers que vous suggérez pour les personnes confrontées à de nombreuses classes interdépendantes réparties sur plusieurs fichiers source et en-tête?

Je rencontre cette situation dans mon projet et la résolution des erreurs liées à la définition de classe qui traversaient plusieurs fichiers d’en-tête est devenue un casse-tête.

68voto

Tom Points 6758

Quelques directives générales:

  • Paire de vos interfaces avec les implémentations. Si vous avez foo.cxx, tout ce que définis dans la il y avait mieux être déclaré en foo.h.
  • S'assurer que chaque fichier d'en-tête #inclut tous les autres en-têtes ou de l'avant-déclarations nécessaires à indépendant de la compilation.
  • Résister à la tentation de créer un "tout" en-tête. Ils sont toujours mal en bas de la route.
  • Mettre un ensemble de (et interdépendants) fonctionnalités dans un seul fichier. Java et d'autres environnements d'encourager une classe par fichier. Avec C++, vous souhaitez souvent un ensemble de classes par fichier. Il dépend de la structure de votre code.
  • Préférez l'avant de la déclaration sur #includes chaque fois que possible. Cela vous permet de briser le cyclique en-tête de dépendances. Essentiellement, pour les dépendances entre les fichiers distincts, vous voulez un fichier-graphe de dépendance qui ressemble à quelque chose comme ceci:
    • A.cxx exige A.h et B.h
    • B.cxx exige A.h et B.h
    • A.h exige B.h
    • B.h indépendant (et de l'avant-déclare les classes définies en A.h)

Si votre code est destiné à être une bibliothèque consommées par d'autres développeurs, il ya quelques étapes supplémentaires qui sont importantes à prendre:

  • Si nécessaire, utiliser le concept de "privées de les en-têtes". C'est, fichiers d'en-tête qui sont requis par la source de plusieurs fichiers, mais jamais requis par l'interface publique. Ce peut être un fichier avec des courants en ligne fonctions, macros, internes ou des constantes.
  • Séparer votre interface publique privé, la mise en œuvre au niveau de système de fichiers. J'ai tendance à utiliser include/ et src/ sous-répertoires dans mon C ou C++ projets - include/ a tous mes en-têtes publics, et src/ a toutes mes sources. et privés en-têtes.

Je vous recommande de trouver un exemplaire de Jean Lakos livre à Grande Échelle en C++ de Logiciels de Conception. C'est un assez salée livre, mais si vous venez de parcourir quelques-uns de ses discussions sur l'architecture physique, vous apprendrez beaucoup de choses.

8voto

Jonathan Leffler Points 299946

Découvrez le C et le C++ normes de codage lors de la NASA Goddard Space Flight Center. La seule règle que j'ai spécialement indiqué dans la norme C et ont adopté dans mon propre code est celui qui applique le "autonome" la nature de fichiers d'en-tête. Dans le fichier d'implémentation xxx.cpp pour l'en-tête de xxx.h, de s'assurer que xxx.h est le premier en-tête inclus. Si l'en-tête n'est pas autonome, à tout moment, puis la compilation échouera. Il est magnifiquement simple et efficace à la règle.

Le seul moment où il ne vous est si vous port entre les machines, et le xxx.h en-tête comprend, disons, <pqr.h>, mais <pqr.h> exige que les installations qui se trouvent être mis à disposition par un en-tête <abc.h> sur la plate-forme d'origine (donc <pqr.h> inclut <abc.h>), mais les installations ne sont pas mis à disposition par <abc.h> sur l'autre plate-forme (ils sont en def.h au lieu de cela, mais <pqr.h> ne comprennent <def.h>). Ce n'est pas un défaut à la règle, et le problème est plus facilement diagnostiqué et résolu si vous suivez la règle.

6voto

yesraaj Points 12759

Vérifiez la section du fichier d'en-tête dans le guide de style de Google.

5voto

Rob Wells Points 21714

La réponse de Tom est excellente!

La seule chose que j'ajouterais, c'est de ne jamais avoir "à l'aide de déclarations" dans les fichiers d'en-tête. Ils ne devraient être autorisés que dans les fichiers d'implémentation, par exemple foo.cpp .

La logique à cet égard est bien décrite dans l'excellent livre "C ++ accéléré" ( lien Amazon - conçu pour le script kiddie link nazis)

3voto

Steve Fallows Points 4059

Un dernier point en plus des autres ici:

N'incluez aucune définition privée dans un fichier d'inclusion. Par exemple, toute définition utilisée uniquement dans xxx.cpp doit l'être dans xxx.cpp, et non xxx.h.

Cela semble évident, mais je le vois fréquemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X