2010-07-21 7 views
1

Si vous avez une classe qui a des constantes nommées, quelle est la meilleure PRACTIVE pour stocker les constantes:Où stocker les constantes de classe nommées spécifiques en C++

Option 1: Espace de noms en tête de classe

Donc, dans mon en-tête de la classe j'aurai:

class myClass 
{ 
... 
... 
}; 

namespace NamedConstants 
{ 
    const string Bucket = "Bucket"; 
} 

Option 2 Constantes membres

class MyClass {  // this goes in the class 
private:       // header file 
    static const string Bucket; 
    ... 
}; 

... et dans le fichier de mise en œuvre de la classe:

const string MyClass::Bucket = "Bucket"; 

je préfère l'option 1, considérant comme plus propre: le nom de la variable et la valeur apparaissent ensemble. En outre, si vous donnez l'espace un bon nom alors il peut rendre le code plus lisible lorsque vous utilisez des constantes:

TrafficLight::Green 

-ce que quelqu'un vois aucun problème avec cette méthode sur l'option 2?

+0

Les valeurs de chaîne sont-elles spécifiques à la classe ou globales? – DumbCoder

+0

@DumbCoder Dans mon exemple, ils sont spécifiques à la classe –

+1

duplication possible de [Où mettre des chaînes constantes en C++: membres de classe statiques ou espaces de noms anonymes] (http://stackoverflow.com/questions/2465546/where-to-put -constant-strings-in-c-static-class-members-ou-anonymous-namespace) –

Répondre

3

Si les chaînes sont destinées à être vues/utilisées par les utilisateurs de la classe, vous ne considéreriez pas les membres de la classe private. Donc, je conclus qu'ils ne sont pas destinés à être vus/utilisés par les utilisateurs de la classe. Mais alors cela n'a aucun sens de les mettre dans l'en-tête du tout.

Si vous les mettez dans la classe (ou dans le périmètre d'espace de noms dans l'en-tête), toutes les modifications à leur type et l'identificateur clients de force à recompiler leur code.

Si vous les mettez dans la classe fichier d'implémentation, ils sont un détail privé de la classe mise en œuvre et les changements pour les forcer que recompilation de la mise en œuvre de la classe.
Si vous les mettez dans un espace de noms sans nom , ils ne peuvent pas entrer en collision avec un autre nom:

namespace { 
    namespace NamedConstants 
    { 
    const string Bucket = "Bucket"; 
    } 
} 
+0

L'espace de nommage Sans nom ne le rend pas "plus global" (faute d'un meilleur mot) –

+1

Il le rend privé à ce fichier d'implémentation. –

+1

@David: Juste pour que nous ne nous méprenions pas - cet espace de noms sans nom serait dans le fichier __implementation__ de la classe, pas dans son en-tête. – sbi

1

Option 1 pourrait conduire à un objet chaîne distincte pour chaque fichier qui comprend l'en-tête. Cela dépend donc entre autres de la rareté de vos ressources.

+0

Cependant, si je mets dans le fichier CPP, je n'aurai pas ce problème non? –

+1

@David Relihan exactement –