Frage

Ich habe dieses Enum:

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

const u8 NUM_BUTTON_STATES = 3;

In meiner Button-Klasse habe ich Membervariablen ButtonState state; und ButtonColors colors[NUM_BUTTON_STATES];. Wenn die Schaltfläche Zeichnen, verwende ich colors[state], um die Farben für bekommen, was Zustand in der Taste ist.

Meine Fragen:

  1. Ist der gute Programmierstil? Gibt es einen besseren Weg, es zu tun? (I nur in der Regel Aufzählungen mit switch-Anweisungen verwenden ... mit einem Enum als Array-Index nicht richtig anfühlt.)
  2. Sie I Haben , um die Werte der Enumeration angeben? Es scheint von standardmäßig 0 und Schrittweite von 1 zu starten, aber es garantiert auf diese Weise in allen Compilern arbeiten?
War es hilfreich?

Lösung

Ist das gut Programmierstil?

Ich glaube schon. Ich mache das gleiche recht häufig.

Gibt es einen besseren Weg, es zu tun?

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

Nachteil ist, dass NUMBER_OF_BUTTON_STATES ist jetzt ein gültiger Button :: Staat Wert. Kein großes Problem, wenn Sie diese Werte um als ints sind vorbei . Aber Schwierigkeiten, wenn Sie erwarten eigentlich ein Button :: Staat .

eine ENUM als Array-Index Verwendung nicht richtig anfühlt.

Es ist in Ordnung. Nur DOCUMENT es, so dass der nächste Mann weiß, was los ist! (Das ist, was Kommentare sind).

Muss ich die Werte der Enumeration angeben?

Mit Nein '=' Zuordnung, Enum des soll auf Null beginnen und erhöht nach oben.

Wenn ein ENUM-Eintrag hat einen ‚=‘ zugewiesenen Wert, nachfolgende nicht ‚=‘ ENUM-Einträge von dort weiter zu zählen.

Quelle: Die Annotated C ++ Reference Manual , S. 113

Wie gesagt, Ich mag den Anfangswert angeben, nur den Code zu machen, die viel klarer.

Andere Tipps

Ja, es wird gut funktionieren. Das heißt, in jedem Fall Sie wirklich einen weiteren Eintrag in Ihrer Aufzählung setzen sollte den Wert der Menge der Elemente definieren:

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

Dann können Sie das Array wie

definieren
Color colors[STATE_COUNT];

Ansonsten ist es ein Chaos, die Menge von Zuständen synchron mit der Größe des Arrays zu halten. Aufzählungen werden immer bei Null beginnen, wenn nicht anders initialisiert, und dann wird jeder zusätzlicher Eintrag einen Wert über vorherige, wenn nicht anders initialisiert zugeordnet werden. Natürlich wäre es verletzt auch nicht, wenn man explizit eine Null setzen, wenn Sie wollen. Wenn Sie keine weiteren Code dagegen würde wickeln ich den Zugriff auf die rohen Array mit einer Funktion wie

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

oder eine äquivalente getColor Funktion Weiterleitung der Anfrage. Das würde verbieten direkt Indizierung den Array mit einiger ganzen Zahl, die irgendwann scheitern an Sicherheit grenzender Wahrscheinlichkeit würden, weil man die Indizes bekommt falsch.

eine ENUM verwenden ist ok. Aber Sie müssen nicht Werte für jedes Element angeben. Es ist genug, um den ersten Wert angeben. Ich würde nicht davon ausgehen, dass Aufzählungen bei 0 beginnen, weil ich Compiler verwendet habe, die 1 als Startwert verwendet (nicht für PCs, aber einige Compiler für Mikrocontroller haben einige seltsame Verhalten). Auch könnte erhalten Sie die const los:

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

Frage 1: Ich denke, es ist gut, Programmierstil. Ich benutze es die ganze Zeit. Frage 2:. Soweit ich weiß, es ist garantiert, so arbeiten, so dass Sie die Werte nicht angeben müssen

Und ich würde auch NUM_BUTTON_STATES in die Enum setzen.

Style-weise, es ist einfach gut.

Pascal-basierte Sprachen wie Delphi ermöglichen Feldgrenzen als Aufzählungstyp angegeben werden, so können Sie nur Elemente dieses bestimmten Typs als Index verwenden.

Es ist völlig normal, eine ENUM für die Indizierung in ein Array zu verwenden.

Sie müssen nicht jedes Enum-Wert angeben, wird sie automatisch um 1 erhöht der Compiler die Werte auswählen Letting verringert die Möglichkeit von Tippfehler und einen Fehler zu schaffen, aber es raubt dir die Werte des Sehens, die nützlich sein könnten bei der Fehlersuche.

Es ist in Ordnung, aber ich würde einige der Überprüfung der Grenzen auf dem Array tun will, als ob jemand eine andere Buttonhinzufügt, haben Sie ein Problem.

Auch sind die Elemente der Farben Array unveränderlich, so sehen vielleicht eine andere Sammlung Array bei Verwendung so, dass Sie diese Unveränderlichkeit erzwingen können. Vielleicht ein Dictionary<ButtonState,ButtonColor>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top