type para libreria example enum c++ enums

c++ - para - Usar una enumeración como un índice de matriz



struct c++ (7)

Tengo esta enumeración:

enum ButtonState { BUTTON_NORMAL = 0, BUTTON_PRESSED = 1, BUTTON_CLICKED = 2 }; const u8 NUM_BUTTON_STATES = 3;

En mi clase de Button tengo variables miembro ButtonState state; y ButtonColors colors[NUM_BUTTON_STATES]; . Cuando dibujo el botón, uso colors[state] para obtener los colores para cualquier estado en que se encuentre el botón.

Mis preguntas:

  1. ¿Este es un buen estilo de programación? Hay una mejor manera de hacerlo? (Por lo general, solo uso enumeraciones con instrucciones de cambio ... usar una enumeración como un índice de matriz no me parece correcto).
  2. ¿Debo especificar los valores de la enumeración? Parece comenzar desde 0 por defecto e incrementar en 1, pero ¿se garantiza que funcione de esa manera en todos los compiladores?

En cuanto al estilo, está bien.

Los lenguajes basados ​​en Pascal como Delphi permiten que los límites de la matriz se especifiquen como un tipo de enumeración, por lo que solo puede usar elementos de ese tipo específico como índice.


Es perfectamente normal usar una enumeración para indexar en una matriz.

No tiene que especificar cada valor de enumeración, aumentarán automáticamente en 1. Dejar que el compilador elija los valores reduce la posibilidad de escribir mal y crear un error, pero le priva de ver los valores, que pueden ser útiles para la depuración.


Pregunta 1: Creo que es un buen estilo de programación. Lo uso todo el tiempo. Pregunta 2: Hasta donde yo sé, está garantizado que funciona de esa manera, por lo que no tiene que especificar los valores.

Y pondría NUM_BUTTON_STATES en la enumeración también.


Usar una enumeración está bien. Pero no es necesario que especifique valores para cada elemento. Es suficiente para especificar el primer valor. No asumiría que las enumeraciones comienzan en 0, porque he usado compiladores que usaban 1 como valor inicial (no para PC, pero algunos compiladores de microcontroladores tienen un comportamiento extraño). Además, podrías deshacerte de la const:

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


¿Este es un buen estilo de programación?

Creo que si. Yo hago lo mismo con bastante frecuencia.

Hay una mejor manera de hacerlo?

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

El inconveniente es que NUMBER_OF_BUTTON_STATES ahora es un valor válido de Button :: State . No es un gran problema si está pasando estos valores como puntos . Pero problemas si realmente está esperando un Button :: State .

Usar una enumeración como un índice de matriz no se siente bien.

Está bien. ¡Solo DOCUMENTE , para que el siguiente tipo sepa lo que está pasando! (Para eso son los comentarios)

¿Debo especificar los valores de la enumeración?

Sin asignación ''='', se supone que las enumeraciones comienzan en cero e incrementan hacia arriba.

Si una entrada enum tiene un valor asignado ''='', las entradas no ''='' enum subsiguientes continúan contando desde allí.

Fuente: El Manual de referencia anotado de C ++ , pág. 113

Dicho esto, me gusta especificar el valor inicial solo para que el código sea mucho más claro.


Está bien, pero me gustaría hacer algunos límites verificando en la matriz, como si alguien agregara otro ButtonState, tendrá un problema.

Además, los elementos de la matriz de colores son inmutables, así que tal vez considere usar una colección diferente para la matriz para que pueda aplicar esa inmutabilidad. Tal vez un Dictionary<ButtonState,ButtonColor>


Sí, funcionará bien. Dicho esto, en cualquier caso, debería poner otra entrada en su enumeración que defina el valor de la cantidad de elementos:

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

Entonces puedes definir la matriz como

Color colors[STATE_COUNT];

de lo contrario, es un desastre mantener la cantidad de estados sincrónicos con el tamaño de la matriz. Las enumeraciones siempre comenzarán con cero si no se inicializan de otra manera, y luego a cada entrada adicional se le asignará un valor uno por encima de la anterior, si no se inicializa de otro modo. Por supuesto, tampoco le haría daño si pone un cero explícitamente si lo desea. Si no te importa el código adicional, envolvería el acceso a la matriz en bruto usando una función como

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

O una función getColor equivalente reenviando la solicitud. Eso prohibiría indexar directamente la matriz con un número entero, que casi con certeza en algún momento fallaría porque uno obtiene los índices incorrectos.