Pergunta

Eu tenho essa enumeração:

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

const u8 NUM_BUTTON_STATES = 3;

Na minha classe Button Tenho membro variáveis ??ButtonState state; e ButtonColors colors[NUM_BUTTON_STATES];. Ao desenhar o botão, eu uso colors[state] para obter as cores para qualquer estado o botão está na.

As minhas perguntas:

  1. É este bom estilo de programação? Há uma melhor forma de fazê-lo? (Eu normalmente só usar enums com declarações switch ... usando uma enum como um índice da matriz não se sente bem.)
  2. Do I Have para especificar os valores do enum? Parece que começar do 0 por padrão e incremento por 1 mas é garantido para trabalhar dessa forma em todos os compiladores?
Foi útil?

Solução

É este o estilo de boa programação?

Eu acho que sim. Eu faço a mesma coisa com bastante freqüência.

Existe uma maneira melhor de fazer isso?

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

Drawback é que NUMBER_OF_BUTTON_STATES é agora um válido Button :: State valor. Não é um grande problema se você estiver passando esses valores em torno de como ints . Mas o problema se você está realmente esperando um Button :: State .

Usando um enum como um índice da matriz não se sente bem.

É bom. Apenas DOCUMENTO , então o próximo cara sabe o que está acontecendo! (Isso é o que os comentários são para.)

Eu tenho que especificar os valores do enum?

Com nenhuma atribuição '=', enum do devem começam em zero e incremento para cima.

Se uma entrada de enumeração tem um '=' valor atribuído, não posterior '=' entradas enum continuar a contagem de lá.

Fonte: O Manual Annotated C ++ referência , pg 113

Dito isso, eu gostaria de especificar o valor inicial apenas para fazer o código que muito mais clara.

Outras dicas

Sim ele vai funcionar bem. Dito isto, em qualquer caso, você realmente deve colocar outra entrada na sua enumeração que define o valor da quantidade de itens:

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

Em seguida, você pode definir a matriz como

Color colors[STATE_COUNT];

caso contrário, é uma bagunça para manter a quantidade de estados síncrona com o tamanho da matriz. Enumerações sempre começam com zero se não o contrário inicializado, e depois cada entrada adicional será atribuído um valor um acima do anterior, se não for inicializado. Claro que também não faria mal se você colocar um zero explicitamente se quiser. Se você não se importa código adicional, gostaria de envolver o acesso à matriz matéria usando uma função como

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

Ou uma função getColor equivalente encaminhar o pedido. Que proíbem a indexação diretamente a matriz com algum inteiro, que quase certamente em algum momento falham porque se tem a errada índices.

Usando um enum é ok. Mas você não tem que especificar valores para cada item. É o suficiente para especificar o primeiro valor. Eu não diria que enums começam em 0, porque eu usei compiladores que utilizavam 1 como o valor inicial (não para PCs, mas alguns compiladores para microcontroladores têm algum comportamento estranho). Além disso, você pode se livrar da const:

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

Pergunta 1: Eu acho que é bom estilo de programação. Eu uso isso o tempo todo. Pergunta 2:. Tanto quanto eu sei, isso é garantido que funcione dessa forma, para que você não tem que especificar os valores

E eu colocaria NUM_BUTTON_STATES na enumeração também.

Em termos de estilo, é apenas multa.

linguagens baseadas em Pascal como Delphi permitir limites de matriz a ser especificado como um tipo de enum, assim você só pode usar itens desse tipo específico como um índice.

É perfeitamente normal usar uma enumeração para a indexação em uma matriz.

Você não tem que especificar cada valor de enum, que será incrementado automaticamente por 1. Deixar o compilador escolher os valores reduz a possibilidade de erros de digitação e criando um bug, mas priva-o de ver os valores, o que pode ser útil na depuração.

Está tudo bem, mas eu gostaria de fazer alguns verificação de limites sobre a matriz, como se alguém acrescenta outra ButtonState, você terá um problema.

Além disso, os elementos do array de cores são imutáveis, então talvez olhar usando um conjunto diferente de matriz para que você pode impor que a imutabilidade. Talvez um Dictionary<ButtonState,ButtonColor>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top