Je suis curieux de connaître les avantages/inconvénients de différentes options de déclaration et de définition de constantes en C++. Pendant très longtemps, je viens de les déclarer en haut du fichier d'en-tête avant la définition de classe:Où déclarer/définir des constantes de portée de classe en C++?
//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};
Bien que ce pollue l'espace de noms global (que je sais est une mauvaise chose, mais je n'ai jamais trouvé une liste de raisons pour lesquelles elle est mauvaise), les constantes seront toujours étendues à des unités de traduction individuelles, de sorte que les fichiers qui n'incluent pas cet en-tête n'auront pas accès à ces constantes. Mais vous pouvez obtenir des collisions de noms si d'autres classes définissent une constante du même nom, ce qui n'est sans doute pas une mauvaise chose car cela peut être une bonne indication d'une zone qui pourrait être refactorisée.
Récemment, j'ai décidé qu'il serait préférable de déclarer des constantes spécifiques de classe à 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ée selon que l'on utilise uniquement en interne constante la classe ou est nécessaire pour d'autres objets qui utilisent la classe. C'est ce que je pense être la meilleure option en ce moment, principalement parce que vous pouvez garder les constantes de classes internes privées à la classe et toutes les autres classes utilisant les constantes publiques auraient une référence plus détaillée à la source de la constante (ex: MyClass: : MyConst). Il ne polluera pas non plus l'espace de noms global. Bien que cela ait l'inconvénient de nécessiter une initialisation non-intégrale dans le fichier cpp. J'ai également envisagé de déplacer les constantes dans leur propre fichier d'en-tête et de les placer dans un espace de noms au cas où une autre classe aurait besoin des constantes, mais pas de la définition de classe entière.
Juste à la recherche d'opinions et éventuellement d'autres options que je n'avais pas encore considérées.
Oui, mais vous devez utiliser 'static' ou un espace de noms anonyme dans ce cas - si vous ne le faites pas, dans certaines implémentations vous polluez l'espace de noms global Utilisé par l'éditeur de liens et obtenir des collisions de noms sur les liens ... – hjhill