2016-07-14 24 views
-1

Ich habe eine Klasse, deren Mitglied ein Enum innerhalb dieser Klasse deklariert:Standardwert von Enum in der Klasse erklärt

#include<iostream> 

class test 
{ 
public: 
    enum TYPE{MAN, WOMAN}; 

    TYPE type; 
}; 


int main() 
{ 
    test x; 
    if(x.type == test::MAN) std::cout<<"MAN"<<std::endl; 
    if(x.type == test::WOMAN) std::cout<<"WOMAN"<<std::endl; 
    std::cout<<"ok"<<std::endl; 
    return 0; 
} 

ich know, dass, wenn eine Enumeration im Namespacebereich deklariert wird, es einen Standardwert hat 0 und Wenn es lokal deklariert wird, hat es keine Standardwerte, was zu undefiniertem Verhalten führt.

Meine Frage ist: Was passiert, wenn ich eine Enum habe, die zu einer Klasse gehört? Ist es auch undefiniertes Verhalten?

testete ich den obigen Code und x.type ist weder MAN noch FRAU. Allerdings habe ich es nur für einen Compiler und ein Betriebssystem getan. Ich bin an einer allgemeineren Antwort interessiert. Ich habe nirgendwo anders Informationen zu diesem Thema gefunden.

Edit1: Kann die Bezugnahme auf diesen unbestimmten Wert einen Segmentierungsfehler verursachen?

Edit2: Ich weiß, das ist keine gut gestaltete Klasse - es ist nicht meins und ich versuche es zu debuggen. Wenn ich also sage, dass ich ein Objekt initialisieren kann, löst das mein Problem nicht. Bitte behandle es als eine theoretische Frage.

+7

Das hat überhaupt nichts mit Enums zu tun. 'Struktur X {int n; }; 'hätte genau das gleiche Problem. –

+0

Sie sollten Ihrem 'type'-Member entweder einen brace-or-equal-Initialisierer geben oder Ihrer' test'-Klasse einen Standardkonstruktor geben, der 'type' initialisiert – KABoissonneault

+1

Es geht nicht um die Enumeration, es geht darum, eine nicht initialisierte Variable zu lesen . UB. – FrankS101

Antwort

2

Der Standardwert des Vornamens in einer enum ist 0, unabhängig vom Umfang der enum.

Es gibt keinen garantierten Standardwert für eine automatische lokale Variable wie test x; in main hier. Es hat einen unbestimmten Wert. Und es ist Undefined Behavior, um diesen Wert zu verwenden.

Sie können es so ¹default initialisieren:

test x{}; 

¹ Ein subtiler Punkt ist, dass auf höchster Ebene dies eine ” “ Wert-Initialisierung gibt.

+0

Führen Sie meinen Code aus. Es druckt nur * ok *. – user2738748

+1

OP fragt nach dem Standardwert einer enum-Variablen, wenn sie nicht initialisiert ist. – HolyBlackCat

+1

Ich denke, OP bezieht sich auf den Standardwert des -Objekts – KABoissonneault

2

Wenn Ihr Objekt keine Konstruktoren hat, hängt es davon ab, wo Sie Ihr Objekt erstellen. Wenn es global erstellt wird, werden alle Variablen auf Null initialisiert. Wenn nicht, werden sie nicht richtig initialisiert und das Lesen von ihnen führt zu UB.

Sie können die Nullinitialisierung einer nicht globalen Variablen mit test x{}; Syntax erzwingen.

1

Erstens: "Testing" für undefiniertes Verhalten wird fast nie die richtige Antwort geben.

Dies ist undefined behavior, weil Sie von einer nicht initialisierten Variablen mit automatischer Speicherdauer lesen. Eine solche Variable hat einen unbestimmten Wert und darf nicht ausgelesen werden. Jede nicht statische Funktionsumfangsvariable hat eine automatische Speicherdauer.

Ich glaube, Sie verwechseln die Definition des Aufzählungstyp (die innerhalb der Klassendefinition geschieht) mit der Erklärung einer Variablen dieses Typs (bei Funktionsumfang).In Ihrem Beispiel ist x eine Variable mit automatischer Speicherdauer, unabhängig davon, wo der Typ TYPE definiert wurde.