65 votes

À l'aide d'un enum comme un index de tableau

J'ai cette enum:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED = 1,
    BUTTON_CLICKED = 2
};

const u8 NUM_BUTTON_STATES = 3;

Dans ma classe de Bouton j'ai variables de membre ButtonState state; et ButtonColors colors[NUM_BUTTON_STATES];. Lors du dessin du bouton, j'utilise colors[state] pour obtenir les couleurs quel que soit l'état du bouton est dans.

Mes questions:

  1. Est-ce un bon style de programmation? Est-il un meilleur moyen de le faire? (J'ai l'habitude de seulement utiliser les énumérations avec les instructions switch... à l'aide d'un enum comme un index de tableau ne se sent pas bien.)
  2. Dois-je avoir pour spécifier les valeurs de l'enum? Il semble commencer à partir de 0 par défaut et par incrément de 1, mais est-il garanti pour fonctionner de cette façon dans tous les compilateurs?

53voto

Mr.Ree Points 5112

Est-ce un bon style de programmation?

Je pense que oui. Je fais la même chose assez fréquemment.

Est-il un meilleur moyen de le faire?

class Button
{
public:
    // Used for array indexes!  Don't change the numbers!
  enum State {
    NORMAL = 0,
    PRESSED,
    CLICKED,
    NUMBER_OF_BUTTON_STATES
  };
};

Inconvénient est que NUMBER_OF_BUTTON_STATES est maintenant valide Bouton::État de la valeur. Pas un gros problème si vous êtes de passage à ces valeurs autour comme ints. Mais la difficulté, si vous êtes réellement attend à un Bouton::de l'État.

À l'aide d'un enum comme un index de tableau ne se sent pas bien.

C'est la fin. Juste le DOCUMENT , de sorte que le gars à côté, sait ce qu'il se passe! (C'est ce que les commentaires sont pour.)

Dois-je spécifier les valeurs de l'enum?

Avec n '=' la cession, l'enum sont censés commencer à zéro, et l'incrément vers le haut.

Si un enum entrée a un '=' la valeur attribuée à l', à la suite non '=' enum entrées de continuer à compter à partir de là.

Source: Le Annoté C++ Manuel de Référence, page 113

Cela dit, je tiens à spécifier la valeur initiale juste pour faire le code beaucoup plus clair.

26voto

Oui il fonctionne bien. Cela dit, dans tous les cas, vous avez vraiment devrait mettre une autre entrée dans votre énumération de la définition de la valeur de la quantité d'articles:

enum ButtonState {
    BUTTON_NORMAL,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    STATE_COUNT
};

Ensuite, vous pouvez définir le tableau comme

Color colors[STATE_COUNT];

sinon, c'est un gâchis pour maintenir la quantité de membres synchrone avec la taille de la matrice. Les énumérations commencez toujours avec zéro si elle n'est pas initialisé, puis chaque entrée supplémentaire sera attribué une valeur au-dessus de la précédente, si elle n'est pas initialisée. Bien sûr, il également ne ferait pas de mal si vous mettez un zéro explicitement si vous le souhaitez. Si vous n'avez pas l'esprit de code supplémentaire, je voudrais envelopper l'accès à l'brutes tableau à l'aide d'une fonction comme

Color & operator[](ButtonState state) {
    return array[state];
}

Ou un équivalent getColor de la fonction de transfert de la demande. Qui interdirait directement l'indexation du tableau avec un certain entier, ce qui serait presque certainement à un certain point d'échouer, car on obtient les indices de mal.

15voto

Stefan Points 29091

À l'aide d'un enum est ok. Mais vous n'avez pas à spécifier des valeurs pour chaque élément. Il suffit de spécifier la première valeur. Je ne présumez pas que les énumérations commencent à 0, parce que j'ai utilisé les compilateurs qui a utilisé 1 comme valeur de départ (pas pour les Pc, mais certains compilateurs pour les microcontrôleurs ont certains comportement bizarre). Aussi, vous pourriez se débarrasser de la const:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    NUM_BUTTON_STATES
};

5voto

Roddy Points 32503

Côté Style, c'est juste bien.

Pascal langages comme Delphi permettre les limites du tableau pour être spécifié comme un type enum, de sorte que vous pouvez utiliser uniquement les éléments d'un type spécifique comme un indice.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X