In welchen Fällen sind enums sinnvoller als Arrays bestehend aus z.B. Strings?
-
Warum sollte man:
enum Obst {Apfel, Birne, Pfirsich, Pflaume, Kirsche};anstatt
string obst[] = {"Apfel", "Birne", "Pfirsich", "Pflaume", "Kirsche"};benutzen?
Der Inhalt von String Arrays ist doch viel einfacher auszugeben, als der von Enums:
Obst frucht = {Kirsche}; cout << "Gibt \"Apfel\" aus : " << obst[0] << ", aber das gibt nur eine Zahl aus: " << frucht << endl;Worin liegt also der Sinn von enums und wann sind sie praktisch oder sinnvoll?
-
Der Computer kann Zahlen schneller vergleichen.
Und im Übrigen sind enums etwas völlig anderes. Angenommen, du hast eine Funktion, die ein Obst erwartet:
void foo(Obst obst);So, hier ist klar, dass man ein "Obst" übergeben soll. Und mit Strings?
void foo(const std::string &obst);Na, hier muss man schon genau hinschauen. Sinnvoller wäre also der Vergleich zwischen enum und:
class Obst { std::string name_; public: Obst(const std::string &obst) : name_(obst) {} bool operator == (const Obst &other) { return ... } };Nur hast du hier wieder das Problem, dass du ja keine festgelegten Namen hast. Autsch. Also wie geht es weiter? Alle Namen im Konstruktor auf Gültigkeit überprüfen? Nein, da nutzt man doch lieber enums. Und falls du enums mal ausgeben möchtest, hindert dich ja nichts daran, die eine ObstToString Funktion oder etwas ähnliches zu bauen.
-
Das mag sein, aber als Programmierer will ich ja sicher nicht nur eine Zahl, sondern den String der an der jeweiligen Enumstelle steht.
Und in Arrays kann ich auch mit Zahlen herumspringen.Außerdem, wenn ich einen String einlese und den mit dem Enum Zeugs vergleichen will, dann muß ich ja trotzdem einen String vergleichen, den, den ich eingegeben habe, und dem, den ich aus dem enum Block entnehme.
-
Warum Enums wenn Arrays schrieb:
Das mag sein, aber als Programmierer will ich ja sicher nicht nur eine Zahl, sondern den String der an der jeweiligen Enumstelle steht.
Eher nicht. Aber wie gesagt, zur Not halt eine ObstZuText Funktion.
Warum Enums wenn Arrays schrieb:
Und in Arrays kann ich auch mit Zahlen herumspringen.
Und damit das keine Magic-Numbers sind, machste dir am besten enums dafür.

Warum Enums wenn Arrays schrieb:
Außerdem, wenn ich einen String einlese und den mit dem Enum Zeugs vergleichen will, dann muß ich ja trotzdem einen String vergleichen, den, den ich eingegeben habe, und dem, den ich aus dem enum Block entnehme.
Enums liest man eigentlich eher selten ein. Eigentlich nie. Wenn dein Programm wirklich nur daraus besteht, würde ich auch auf enums verzichten, dafür sind sie nicht da. Die einzig sinnvolle Anwendung wäre dann halt, wenn du eine Schnittstelle allgemein halten willst.
(z.B: isKeyPressed(Key key); Das kann einfach immer genutzt werden. Da würde ein String auch wenig Sinn machen. Trotzdem kann es ja sein, dass der Anwender die Konfiguration aus einer Datei liest, das ist dann aber seine Sache wie er das umwandelt.)
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x, bzw. C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Die Frage ist in etwas so sinnvoll wie folgende:
"Warum sollte ich ein Auto anstatt einer Bohrmaschine zum Wäsche waschen benutzen?"
Das eine hat mit dem anderen nichts zu tun.
-
Du benutzt das oft parallel. Also zum speichern was für ein Obst irgendwo drin ist verwendest du die enums.
enum Obst {Apfel, Birne, Pfirsich, Pflaume, Kirsche}; Obst zuletztGegessenesObst = Apfel;Damit kann man dann auch einfach Vergleiche anstellen:
Obst morgenEssIch = Birne; if (morgenEssIch == zuletztGegessenesObst) { cout << "WARNUNG!!!! OBST VOR KURZER ZEIT BEREITS GEGESSEN!!!!1111" << endl; }Und wenn du mal den String vom Obst brauchst benutzt du eine Funktion wie
string obstString[] = {"Apfel", "Birne", "Pfirsich", "Pflaume", "Kirsche"}; string obstString(Obst foo){ return obstString[foo]; }; //Und dann ganz einfach... cout << "Zuletzt gegessenes Obst: " << obstString(zuletztGegessenesObst) << endl;
-
Wenn du dich bei einem Enum-Element vertippst, dann hast du einen Compilererror mit Zeilenangabe, dass es mit einer modernen IDE eine Sache von Sekunden ist das zu korrigieren.
Wenn du dich bei einen String vertippst nichts und du darfst komische Fehler zur Laufzeit ausarbeiten.
-
Was hat das Thema in C++ zu suchen?
Enums vs. String Arrays sind ein Programmierkonzept, darauf zielt auch die Frage ab und hat nur eingeschränkt etwas mit C++ zu tun.