Pregunta

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 botones, tengo variables miembro Estado del estado del botón; y ButtonColors colores [NUM_BUTTON_STATES]; . Al dibujar el botón, uso colors [estado] para obtener los colores para el estado en que se encuentre el botón.

Mis preguntas:

  1. ¿Es este buen estilo de programación? Hay una mejor manera de hacerlo? (Por lo general, solo uso enumeraciones con declaraciones de cambio ... usar una enumeración como índice de matriz no parece correcto).
  2. ¿Tengo tengo para especificar los valores de la enumeración? Parece que comienza desde 0 por defecto e incrementa en 1, pero ¿está garantizado que funcione de esa manera en todos los compiladores?
¿Fue útil?

Solución

¿Es este un buen estilo de programación?

Creo que sí. 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 ints . Pero tenga problemas si realmente está esperando un Button :: State .

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

Está bien. Solo DOCUMENTO , para que el próximo que sepa lo que está pasando. (Para eso están los comentarios).

¿Tengo que especificar los valores de la enumeración?

Sin la asignación '=', se supone que los enum comienzan en cero y se incrementan hacia arriba.

Si una entrada de enumeración tiene un valor asignado '=', las siguientes entradas de enumeración que no sean '=' continúan contando desde allí.

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

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

Otros consejos

Sí, funcionará bien. Dicho esto, en cualquier caso, realmente 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 sincronizada la cantidad de estados 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 superior al anterior, si no se inicializa de otra manera. Por supuesto, tampoco estaría de más si pones un cero explícitamente si quieres. Si no le importa el código adicional, envolvería el acceso a la matriz sin formato utilizando una función como

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

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

Está bien usar una enumeración Pero no tienes que especificar valores para cada elemento. Es suficiente para especificar el primer valor. No asumo que las enumeraciones comienzan en 0, porque he usado compiladores que usaron 1 como valor de inicio (no para PC, pero algunos compiladores para microcontroladores tienen algún comportamiento extraño). Además, podrías deshacerte de la const:

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

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

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

En cuanto al estilo, está bien.

Los idiomas 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 un índice.

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

No tiene que especificar cada valor de enumeración, se incrementará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, lo que podría ser útil en depuración.

Está bien, pero me gustaría hacer algunas comprobaciones de límites en la matriz, ya que si alguien agrega otro ButtonState, tendrá un problema.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top