Où déclarer/définition de la portée de classe constantes en C++?

Je suis curieux de connaître les avantages/inconvénients des différentes constante de la déclaration et la définition des options en C++. Pour le plus de temps, je viens de déclarant en haut de l'en-tête du fichier avant la définition de la classe:

//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};

Tout cela pollue l'espace de noms global (qui je sais, c'est une mauvaise chose, mais n'ai jamais trouvé une liste de blanchisserie de raisons pour lesquelles il est mauvais), les constantes pourront encore être portée à l'individu d'unités de traduction, et donc les fichiers qui ne comprennent pas que cet en-tête n'ont pas accès à ces constantes. Mais vous pouvez obtenir des collisions de nom si d'autres classes de définir une constante du même nom, qui est sans doute pas une mauvaise chose car cela peut être une bonne indication d'une zone qui pourrait être remaniée.

Récemment, j'ai décidé qu'il serait mieux de déclarer la classe spécifique constantes à l'intérieur de la définition de la classe elle-même:

//.h
class MyClass {
    public:
         static const int MyConst = 10;
...
    private:
         static const string MyStrConst;
...
};
//.cpp
const string MyClass::MyStrConst = "String";

La visibilité de la constante serait ajusté en fonction de si la constante est utilisé uniquement en interne à la classe ou est nécessaire pour les autres objets qui utilisent la classe. C'est ce que je pense est la meilleure option à l'heure actuelle, principalement parce que vous pouvez garder interne des constantes de classe privée à la classe et les autres classes de l'aide du public constantes ne seraient plus en détail la référence à la source de la constante (par exemple Maclasse::MyConst). Il aussi de ne pas polluer l'espace de noms global. Bien qu'il ait, au détriment de l'nécessitant non partie intégrante de l'initialisation dans le fichier cpp.

J'ai aussi envisagé de déménager les constantes dans leur propre fichier d'en-tête et les emballer dans un espace de noms dans le cas de certains autres besoins de la classe des constantes, mais pas l'ensemble de définition de classe.

Simplement à la recherche d'avis et éventuellement d'autres options que je n'avais pas encore réfléchi.

InformationsquelleAutor bsruth | 2010-01-11