Domanda

Ho questo enum:

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

const u8 NUM_BUTTON_STATES = 3;

Nella mia classe Button ho variabili membro Stato ButtonState; e ButtonColors colori [NUM_BUTTON_STATES]; . Quando disegno il pulsante, uso colors [state] per ottenere i colori per qualunque stato si trovi il pulsante.

Le mie domande:

  1. È un buon stile di programmazione? C'è un modo migliore per farlo? (Di solito uso solo enum con istruzioni switch ... usare un enum come indice di array non mi sembra giusto.)
  2. Devo avere per specificare i valori dell'enum? Sembra iniziare da 0 per impostazione predefinita e incrementare di 1 ma è garantito che funzioni in questo modo in tutti i compilatori?
È stato utile?

Soluzione

È buono questo stile di programmazione?

Penso di si. Faccio la stessa cosa abbastanza frequentemente.

Esiste un modo migliore per farlo?

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

Lo svantaggio è che NUMBER_OF_BUTTON_STATES è ora un valore Button :: State valido. Non è un grosso problema se si passano questi valori come ints . Ma guai se ti aspetti un pulsante :: stato .

L'uso di un enum come indice di array non è corretto.

Va ??bene. Basta DOCUMENTO , quindi il prossimo ragazzo sa cosa sta succedendo! (Ecco a cosa servono i commenti.)

Devo specificare i valori dell'enum?

Senza assegnazione '=', si suppone che di enum inizi da zero e aumenti verso l'alto.

Se una voce enum ha un valore '=' assegnato, le successive voci enum non '=' continuano a contare da lì.

Fonte: Manuale di riferimento C ++ annotato , pag. 113

Detto questo, mi piace specificare il valore iniziale solo per rendere il codice molto più chiaro.

Altri suggerimenti

Sì, funzionerà bene. Detto questo, in ogni caso davvero dovresti inserire un'altra voce nella tua enumerazione definendo il valore della quantità di articoli:

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

Quindi puoi definire l'array come

Color colors[STATE_COUNT];

altrimenti, è un casino mantenere la quantità di stati sincroni con la dimensione dell'array. Le enumerazioni inizieranno sempre con zero se non inizializzato altrimenti, quindi a ciascuna voce aggiuntiva verrà assegnato un valore uno sopra quello precedente, se non altrimenti inizializzato. Ovviamente non farebbe male se si inserisse uno zero esplicitamente se si desidera. Se non ti dispiace aggiungere un codice aggiuntivo, chiuderei l'accesso all'array raw usando una funzione come

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

O una funzione getColor equivalente che inoltra la richiesta. Ciò proibirebbe di indicizzare direttamente l'array con un numero intero, che quasi sicuramente a un certo punto fallirebbe perché si sbagliavano gli indici.

L'uso di un enum è ok. Ma non è necessario specificare i valori per ogni articolo. È sufficiente specificare il primo valore. Non darei per scontato che gli enum inizino da 0, perché ho usato compilatori che usavano 1 come valore iniziale (non per PC ma alcuni compilatori per microcontrollori hanno un comportamento strano). Inoltre, potresti sbarazzarti della const:

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

Domanda 1: penso che sia un buon stile di programmazione. Io lo uso per tutto il tempo. Domanda 2: Per quanto ne so, è garantito che funzioni in questo modo, quindi non è necessario specificare i valori.

E aggiungerei NUM_BUTTON_STATES anche nell'enum.

Per quanto riguarda lo stile, va bene.

I linguaggi basati su Pascal come Delphi consentono di specificare i limiti dell'array come tipo enum, quindi è possibile utilizzare solo gli elementi di quel tipo specifico come indice.

È perfettamente normale usare un enum per indicizzare in un array.

Non è necessario specificare ciascun valore enum, aumenteranno automaticamente di 1. Consentire al compilatore di selezionare i valori riduce la possibilità di errori di digitazione e creazione di un bug, ma ti priva di vedere i valori, che potrebbe essere utile nel debug.

Va ??bene, ma vorrei fare qualche controllo sull'array, come se qualcuno aggiungesse un altro ButtonState, avrai un problema.

Inoltre, gli elementi della matrice dei colori sono immutabili, quindi forse cerca di usare una raccolta diversa per la matrice in modo da poter applicare quell'immutabilità. Forse un Dictionary<ButtonState,ButtonColor>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top