est-ce une mauvaise pratique d'avoir énuméré enums en C ++ directement au niveau de l'espace de noms? Je veux dire non associé à une classe? Dis si j'ai une énumérum et une classe qui ressemble à quelque chose comme ça,
enum Player { USER, COMPUTER} class Game { //Logic of the game. };
6 Réponses :
S'il est utilisé uniquement à l'intérieur du jeu code> code>, j'aurais placé l'énumé à l'intérieur. P>
Si Enum Player code> est utilisé ... p>
Jeu de classe Code> -> Mettez dans Portée privée forte> Portée Li>
jeu de classe code> et ses classes d'enfants -> mettre en protégé fort> portée li>
jeu de classe code> et utilisé à différents endroits -> mettre
dans
jeu code> -> Mettre dans Global / Namespace Strong> Portée Li>
ul>
Ceci est purement une question de préférence; Cependant, j'ai tendance à aller avec Java-like Enums en C ++:
class PlayerType { public: enum VALUE {USER, COMPUTER}; explicit PlayerType(VALUE val) : value_(val) {} operator VALUE() const { return value_; } bool operator==(VALUE other) const { return value_ == other; } bool operator!=(VALUE other) const { return value_ != other; } private: VALUE value_; // Copy and assign intentionally allowed. };
Cette réponse a été écrite à l'origine en 2011. Maintenant que la prise en charge de C ++ 11 est largement disponible, la manière préférée est d'utiliser de classe code>, comme Matthew D. Scholefield souligne ci-dessous: p>
namespace Player {
enum Type {
USER,
COMPUTER
}
}
Au lieu d'un préfixe cryptique à deux caractères, envisagez par exemple. Struct Player {Enum Enum {Utilisateur, ordinateur}; }; code>. Dans un an ou deux qui pourraient être inutiles, car les compilateurs commencent à prendre en charge les caractéristiques C ++ 11. Mais jusque-là ... Quoi qu'il en soit, c'est une bonne idée de réserver tout majuscule b> pour les macros. Beaucoup de gens font ça.
@ Alfp.steinbach Je suis d'accord. Cependant, j'ai tendance à préférer les espaces de noms aux structures pour enclîchements d'énums, comme l'introduction d'un espace de noms n'introduit aucun nouveau type au système.
@Martin: Je préfère le struct code> précisément parce qu'il introduit un type. C'est très pratique (par exemple, vous pouvez hériter de cela). Un type n'utilise pas la mémoire ou quoi que ce soit: c'est un coût zéro.
Notez que mettre le enum code> dans un espace de noms code> ou un
struct code> met non seulement les noms des constantes dans l'espace de noms ou la structure, mais aussi les noms du type. Donc, si le code client souhaite déclarer une variable du type, il doit écrire
lecteur :: Tapez code>, et pas seulement
type code>. Si vous avez C ++ 11, vous pouvez utiliser
Enum Class Type CODE> pour mettre les constantes ENUM dans la portée de l'ENUM elle-même (et inhiber la conversion automatique vers
int code>).
Utilisez généralement une portée minimale pour quoi que ce soit. Cela facilite la compréhension des choses. P>
Cependant, la clarté ou l'absence de celle-ci due au placement de ce Notez que Java n'a pas de préprocesseur, pas de macros. C'est plus qu'un peu idiot de prendre une convention qui est originaire de C, pour maintenir les macros dans un "espace de noms" distinct et l'appliquer sans comprendre à quelque chose d'autre de manière à être à des fins complètement transversales avec l'intention originale. P> Enum code> à l'intérieur ou à l'extérieur d'une classe, n'est rien comparé au crier em>, l'utilisation de tout Identificateurs majuscules strong>. Réserver ceux des macros. En Java, ils sont utilisés pour les constantes, car Java a obtenu son apparence et ressent de C, où il n'est pas si inhabituel de définir des constantes comme des macros (parce que précoce C n'avait pas
const code>). P>
@KMAC: C ++ a obtenu la syntaxe de base directement auprès de C, pas seulement regarder et sentir. Et C ++ l'a étendu et changé, dans la tradition de C à l'époque, qui était également très en flux. Au début de C, les créateurs ont souvent utilisé des noms macro minuscules. Vous pouvez voir des vestiges de cela par ex. affirmez code> et
errno code> et ainsi de suite. La convention majuscule a évolué pour devenir dominante comme le temps passé et l'expérience montée. Mais c'est dans le but de minimiser les collisions de noms pour les macros. Java n'a pas de macros et a adopté la convention pour son utilisation pour définir les constantes en C i>. Cette utilisation est hors de propos en C ++.
Il est préférable de définir énum dans l'espace de noms p>