enum class (C++ Component Extensions)
Deklaruje wyliczenie, który jest zdefiniowanym przez użytkownika typem składającym się z szeregu nazwanych stałych zwanych wyliczeniami.
Wszystkie czasy wykonania
Uwagi
C++/CX i C++/CLI wspiera public enum class i private enum class które są podobne do standardowych wyliczeń klasy C++, ale z dodanym specyfikatorem ułatwień dostępu.Aby uzyskać więcej informacji o starszych standardowych słowach kluczowych w języku C++ enum, zobacz Deklaracje wyliczania C++.
Środowisko wykonawcze systemu Windows
Składnia
access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];
Parametry
dostęp
Dostępność enumeracji, która może być public lub private.identyfikator wyliczenia
Nazwa wyliczenia.Typ podstawowy
(Opcjonalnie) Leżący u podstaw typ enumeracji.(Opcjonalnie.tylko Środowisko wykonawcze systemu Windows) podlegający typ enumeracji, którym może być bool, char, char16, int16, uint16, int, uint32, int64 lub uint64.
Moduł wyliczający listy
Rozdzielana przecinkami lista nazw moduł wyliczający.Wartość każdego enumeratora jest wyrażeniem stałym albo zdefiniowanym niejawnie przez kompilator, albo jawnie przez zapis enumerator=wyrażenie stałe.Domyślnie wartość pierwszego modułu wyliczającego wynosi zero, jeśli nie jest pośrednio zdefiniowana.Wartością każdego kolejnego modułu wyliczającego zdefiniowanego niejawnie jest wartość poprzedniego modułu wyliczającego + 1.
var
(Opcjonalnie) Nazwa zmiennej typu enumeracji.
Uwagi
Aby uzyskać dodatkowe informacje i przykłady, zobacz Wyliczenia.
Należy zauważyć, że kompilator generuje komunikaty o błędach, jeśli wyrażenie stałe, które definiuje wartość modułu wyliczającego, nie da się reprezentować przez typ bazowy.Jednak kompilator nie zgłasza błędu dotyczącego wartości, która jest nieodpowiednia dla podstawowego typu.Na przykład:
Jeśli podstawowy typ jest liczbą i moduł wyliczający określa maksymalną wartość dla tego typu, nie można przedstawić wartości następnego wyliczenia zdefiniowanego niewyraźnie.
Jeśli podstawowe typy jest bool, i więcej niż dwa moduły wyliczające są wyraźnie zdefiniowane, moduły wyliczające po dwóch pierwszych nie może być przedstawione.
Jeśli podstawowy typ jest char16, a wartość wyliczenia znajduje się w zakresie od 0xD800 do 0xDFFF, wartość może być reprezentowana.Jednakże wartość jest logicznie niepoprawna, ponieważ reprezentuje ona pół zastępcze pary Unicode i nie powinna być wyświetlana sama.
Wymagania
Opcja kompilatora: /ZW
Środowisko uruchomieniowe języka wspólnego
Składnia
access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;
Parametry
access
Dostępność typu enum.Mogą być albo publiczny albo private.enumerator-list
Rozdzielana przecinkami lista identyfikatorów (moduły wyliczające) w wyliczeniu.name
Nazwa wyliczenia.Anonimowe wyliczenia zarządzane nie są dozwolone.type (opcjonalnie)
Podlegający typ identyfikatorów.Może to być każdy typ skalarny, taki jak wersje int, short lub long ze znakiem lub bez.bool lub char jest również dozwolone.var (opcjonalnie)
Nazwa zmiennej typu enumeracji.
Uwagi
Wylicz klasy i wylicz struktury to równoważne deklaracje.
Istnieją dwa typy enum: zarządzany i standardowy.
Zarządzany element wyliczenia można zdefiniować następujący sposób:
enum class day {sun, mon };
i jest semantycznie równoważne:
ref class day {
public:
static const int sun = 0;
static const int mon = 1;
};
Standardowe wyliczenie można zdefiniować następujący sposób:
enum day2 {sun, mon, };
i jest semantycznie równoważne:
static const int sun = 0;
static const int mon = 1;
Zarządzane nazwy wyliczenia (identyfikatorów) nie są dodawane do zakresu, w którym zdefiniowano wyliczenie; wszystkie odniesienia do modułów wyliczających muszą być w pełni kwalifikowane (Nazwa::identyfikatora).Z tego powodu nie można zdefiniować anonimowego zarządzanego wyliczenia.
Moduły wyliczające standardowego typu enum są zdecydowanie włączane w zawierający je zakres.To znaczy, że jeśli istnieje inny symbol z taką samą nazwą, jak moduł wyliczający w danym kontekście, wówczas kompilator wygeneruje błąd.
W Visual C++ 2002 i Visual C++ 2003 moduły wyliczające były słabo wprowadzone (widoczne w zawartym zasięgu, chyba że wystąpił inny identyfikator o tej samej nazwie).
Jeśli zdefiniowano standardowe wyliczenie C++ (bez klasy lub struct), kompilowania z/CLR spowoduje, że wyliczenie zostanie zestawione jako wyliczenie zarządzane.Enumeracja nadal ma semantykę enumeracji niezarządzanej.Należy zauważyć, że kompilator wstawia atrybut Microsoft::VisualC::NativeEnumAttribute, rozpoznawany przez kompilator Visual C++ w celu oznaczenia intencji programisty, by enum stanowił natywny enum.Inne kompilatory po prostu zobaczą standardowy enum jako zarządzany enum.
Nazwane, standardowe wyliczenie skompilowane z/CLR będą widoczne w zestawie jako zarządzane wyliczenia i mogą być używane przez każdy inny zarządzany kompilator.Jednak nienazwane wyliczenia standardowe nie będą widoczne publicznie z zestawu.
W Visual C++ 2002 i Visual C++ 2003, standardowe wyliczenie używane jako typ parametru funkcji:
// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}
int main() {
E myi = b;
f(myi);
}
będzie wysyłać w MSIL następujące wyniki dla podpisu funkcji:
void f(int32);
Jednak w obecnej wersji kompilatora, standardowe wyliczenie jest emitowane jako wyliczenie zarządzane za pomocą [Macierzysty atrybut wyliczenia] i następujące w MSIL dla podpisu funkcji:
void f(E)
Aby uzyskać więcej informacji na temat wyliczeń macierzystych, zobacz Deklaracje wyliczeń C++.
W środowisku projektowym, można uzyskać Pomoc F1 dla tych słów kluczowych, wyróżniając słowo kluczowe, (enum class, na przykład) i naciskając klawisz F1.
Aby uzyskać więcej informacji na temat wyliczania CLR, zobacz:
Wymagania
Opcja kompilatora: /clr
Przykłady
Przykład
malejąco
// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };
// standard enum
public enum n { c, d };
// unnamed, standard enum
public enum { e, f } o;
int main() {
// consume managed enum
m mym = m::b;
System::Console::WriteLine("no automatic conversion to int: {0}", mym);
System::Console::WriteLine("convert to int: {0}", (int)mym);
// consume standard enum
n myn = d;
System::Console::WriteLine(myn);
// consume standard, unnamed enum
o = f;
System::Console::WriteLine(o);
}Optionally, copy this sequence of tags for each example you want, then populate the text nodes. That is, after section+title("Examples")+content, insert: para+embeddedLabel ("Example")+para(sample description); code(sample); para+embeddedLabel("Output"); computerOutput(sample output, including 'br' tag instead of newlines)
Dane wyjściowe