7
votes

NIVEAU NIVEAU NIVEAU ENUMS EN C ++

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.
};


0 commentaires

6 Réponses :


0
votes

S'il est utilisé uniquement à l'intérieur du jeu , j'aurais placé l'énumé à l'intérieur.


0 commentaires

2
votes

Si Enum Player est utilisé ...

  • Juste dans Jeu de classe -> Mettez dans Portée privée Portée
  • utilisé par jeu de classe et ses classes d'enfants -> mettre en protégé portée
  • il concerne à jeu de classe et utilisé à différents endroits -> mettre dans publique portée
  • Nulle part en relation avec jeu -> Mettre dans Global / Namespace Portée

0 commentaires

1
votes

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.
};


0 commentaires

16
votes

avec C ++ 11

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
  }
}


4 commentaires

Au lieu d'un préfixe cryptique à deux caractères, envisagez par exemple. Struct Player {Enum Enum {Utilisateur, ordinateur}; }; . 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 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 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 dans un espace de noms ou un struct 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 , et pas seulement type . Si vous avez C ++ 11, vous pouvez utiliser Enum Class Type pour mettre les constantes ENUM dans la portée de l'ENUM elle-même (et inhiber la conversion automatique vers int ).



5
votes

Utilisez généralement une portée minimale pour quoi que ce soit. Cela facilite la compréhension des choses.

Cependant, la clarté ou l'absence de celle-ci due au placement de ce Enum à l'intérieur ou à l'extérieur d'une classe, n'est rien comparé au crier , l'utilisation de tout Identificateurs majuscules . 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 ).

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.


1 commentaires

@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 et errno 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 . Cette utilisation est hors de propos en C ++.



-1
votes

Il est préférable de définir énum dans l'espace de noms


0 commentaires