2012-04-09 6 views
3
enum color = {blue, black=3, yellow=3}; 

2 Farben haben den Wert 3, ist es gültig? Ich dachte, eine Aufzählung muss andere Werte haben.Ist diese Aufzählung gültig und wenn ja, warum?

+0

Sie würden nicht in der Lage sein, sowohl schwarz und gelb in einer Case-Anweisung zu verwenden. – jacknad

+0

Es gibt einen Syntaxfehler. Entferne das '=' nach 'color':' enum color = {blau, schwarz = 3, gelb = 3}; '. –

+0

Für das, was es wert ist, ist es nicht ungewöhnlich, Enumerationswerte aus Gründen der Abwärtskompatibilität wiederzuverwenden. Zum Beispiel könnten Sie in Version 1 Ihrer Bibliothek 'enum color {blau, schwarz, grau}} haben; und in Version 2 entscheiden Sie sich für amerikanisches Englisch, so dass Sie' enum color {blau, schwarz, grau, grau = grau}; '. –

Antwort

9

Es gilt, dass es erlaubt ist. Wahrscheinlich kein gutes Design.

Soweit warum, ich bin mir nicht sicher, welche Antwort Sie dort suchen. Wenn es nicht erlaubt wäre, würde es Fälle verhindern, in denen es sinnvoll wäre, wenn zwei enums sich auf denselben Wert beziehen. (Ich bin mir sicher, dass ich leicht Beispiele finden könnte, wo das Sinn macht.) Wenn es also eine Wahl zwischen der Einschränkung ist, was ich tun kann oder der Beschränkung, weil ich normalerweise keine Duplikate haben will, dann ich Ich hätte dafür gestimmt.

+0

Es beantwortet nicht den Warum-Teil des Q. Der Teil, der hier beantwortet wird, kann nur überprüft werden, indem man den gegebenen Code mit '-pedantic' kompiliert. –

+0

@als: Ich weiß nicht, was die Designer gedacht haben, aber meine Antwort hat tatsächlich versucht, die Frage zu beantworten, warum: Weil es Zeiten geben könnte, in denen du zwei Enums mit demselben Wert haben willst. –

+0

Wenn Sie den Zeitstempel in der Bearbeitungsgeschichte der Antwort und den meines Kommentars vergleichen, werden Sie sehen, dass wenn ich die Antwort kommentierte nur sagte: "Es ist gültig, dass es erlaubt ist. Wahrscheinlich nicht ein gutes Design." t antworte dem * Warum? * –

0

Sie haben ein Framework entwickelt. Dieses Framework verwendet enum zur Parametrierung

Aus irgendeinem Grund sind Sie nicht mehr glücklich mit einem früher verwendeten Begriff.

Wenn Sie nur den Begriff ersetzen, wird die vorhandene Software beschädigt. Sie entscheiden sich, alte und neue Terminologie anzubieten (mindestens für einen Freigabezyklus)

0
#include <iostream> 

using namespace std; 

enum color {blue, black=3, yellow=3}; 

int main() 
{ 

    color a = blue; 
    color b = black; 
    color c = yellow; 
    cout<<a<<endl; 
    cout<<b<<endl; 
    cout<<c<<endl; 


     return 0; 
} 

Es ist keine gute Idee, sie gleich zu machen.

2

Die C++ standard, Abschnitt 7.2, Teil 1, erfordert nur, dass die Konstanten Ausdruck eines ganzzahligen oder aufgezählten Typs sein; Die Konstanten müssen nicht unterschieden werden. Dies gibt Ihnen zusätzliche Flexibilität beim Aliasing Ihrer Konstanten, wenn Sie meinen, dass dies Ihren Code expressiver macht. Zum Beispiel

enum color {red=1,green=2,blue=3,max_color=3}; 

if (myColor > max_color) {/* report an error *} 

ist besser als

enum color {red=1,green=2,blue=3}; 

if (myColor > blue) {/* report an error *} 
0

Ja, es ist gültig. Weil es die Sprachspezifikation nicht verletzt. Im Folgenden wird von Entwurf N3242 zitiert, wie Sie im Beispiel sehen können, den Wert im Zusammenhang mit verschiedenem enumerator muss nicht eindeutig sein:

The identifiers in an enumerator-list are declared as constants, 
and can appear wherever constants are required. An enumeratordefinition 
with = gives the associated enumerator the value indicated by the 
constant-expression. The constant-expression shall be an integral 
constant expression (5.19). If the first enumerator has no initializer, 
the value of the corresponding constant is zero. An enumerator-definition without 
an initializer gives the enumerator the value obtained by 
increasing the value of the previous enumerator by one. 
[ Example: 
enum { a, b, c=0 }; 
enum { d, e, f=e+2 }; 
defines a, c, and d to be zero, b and e to be 1, and f to be 3. —end example ] 
Verwandte Themen