Où placer l’énum dans un programme cpp?

J’ai un programme qui utilise des types enum.

enum Type{a,b,}; class A { //use Type }; class B { // also use that Type }; 

2 classes sont situées dans 2 fichiers différents. Devrais-je mettre la définition de type dans un fichier headfile ou dans une définition de classe pour chaque classe?

Si l’énumération doit être utilisée dans plusieurs fichiers .cpp, vous devez la placer dans un fichier d’en-tête qui sera inclus par chacun. S’il existe un fichier d’en-tête commun, vous devez l’utiliser, sinon vous pouvez également créer un nouveau fichier d’en-tête pour cette énumération.

Vous devriez toujours essayer de limiter la scope des types en C ++, de sorte que l’énumération devrait probablement être déclaread à la scope de la classe. L’énumération appartiendra généralement plus naturellement à une classe qu’à une autre – disons à la classe A, vous la mettez donc dans la déclaration de A dans l’en-tête ah:

 // ah class A { public: enum Type { a, b }; ... }; 

Maintenant, vous devez inclure ah dans l’en-tête qui déclare B:

 // bh #include "ah" class B { public: void f( A::Type t ); // use the Type enum ... }; 

Je peux voir l’importance de Neil: c’est une bête noire pour de nombreux programmeurs de voir des choses à l’échelle mondiale. otoh, à mon humble avis, introduire une classe juste pour une enum n’est pas un bon style: c’est censé être enum pas une classe. Cependant, mettre la même liste d’énum dans les deux classes (c’est ce que vous demandiez) serait la pire idée: nous ne voulons pas répéter des choses.

De plus, dans la plupart des codes non sortingviaux, on pourrait finir par utiliser plusieurs de ces entités partagées (plus d’énums, de parameters const, etc.) pour la mise en œuvre. Donc, je commencerais à regrouper tout cela dans un espace de noms d’implémentation (dites “détail”), qui est un espace de noms enfant de vos classes, et résidant dans un fichier d’en-tête séparé (par exemple “detail.hpp”), inclus par tous. Par exemple:

 // file A.hpp #include "foo/detail.hpp" namespace foo { class A { // accessing enum as detail::a }; } // file B.hpp #include "foo/detail.hpp" namespace foo { class B { ... }; } // file foo/detail.hpp namespace foo { namespace detail { enum { a,b, ... } const int three = 3; // etc... // other implementation classes etc... }} 

Et “détail” est un moyen agréable et propre d’avertir les utilisateurs de leur classe de ne pas se préoccuper de ce qui est déclaré ici. Au fur et à mesure que votre code grossit et que ces détails d’implémentation commencent à se multiplier, vous pouvez diviser les dépendances en fichiers d’en-tête distincts (detail1 detail2 etc …) tout en conservant un espace de nom “detail” (ce que vous ne pouvez pas utiliser avec un “détail de classe” ” par exemple).

La question est plutôt vague, mais en règle générale, vous devriez essayer de minimiser la redondance dans votre code. Par conséquent, vous devez placer la déclaration de l’énum dans un fichier d’en-tête.

D’habitude, j’utilise enum dans mon programme c ++ de la même manière que “Neil Butterworth” a dit … J’ai trouvé cette méthode vraiment propre, claire et lisible

Cela dépend vraiment de savoir si les valeurs sont du même type logique ou si elles portent simplement les mêmes noms. Serait-il judicieux d’affecter une variable A :: Type à un C :: Type? S’ils sont du même type logique, placez-les dans un en-tête que les deux incluent. Pour que vos temps de construction restnt brefs, vous voudrez probablement le placer dans son propre fichier d’en-tête, mais le placer dans un en-tête partagé avec d’autres éléments fonctionnera si vous souhaitez limiter le nombre de fichiers.

Une autre option consiste à placer l’énum dans une classe de base commune dont ils héritent tous les deux (ceci peut ne pas avoir de sens dans ce cas, mais c’est une autre option).