C++ enum class

Gast #5441483
Lesenswert?

Hallo zusammen. Ich habe eine Frage zu enum Klassen in C++, ich habe 
folgenden Codeschnipsel gesehen, mr ist aber nicht ganz klar was hier 
passiert:
1
...
2

3
enum class Month {
4
jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
5
};
6

7
// We can use our Month like this:
8
Month m = Month::feb;
9

10
...

Month::feb entspricht dem Wert 2, wie kann ich "m" eine "2" zuweisen wo 
doch "m" alle Enumeratoren von jan - dec hat? Welchem der Enumeratoren 
soll denn diese "2" zugewiesen werden?
Gast #5441491
Lesenswert?

Johannes S. schrieb:
> Es ist eine Aufzählung, m kann einen Wert der Aufzählung Monate
> annehmen.

Das bedeutet also, "m" erhält in diesem Fall nur den Enumerator 
"Month::feb" was dem Zahlenwert 2 entspricht?

Ich war der Meinung, dass jedes Objekt vom Typ Month automatisch alle 
Aufzählungen (jan-dec) beinhaltet. Das "m" zum Zeitpunkt der Deklaration 
leer(bitte das Wort "leer" nicht auf die Goldwage legen) ist und nur 
diejenigen Aufzählungen annehmen kann welche der Typ Month bereitstellt 
das war mir irgendwie nicht so recht klar. Vielen Dank für deine 
Erklärung.
Gast #5441492
Lesenswert?

Johannes S. schrieb:
> Es ist eine Aufzählung, m kann einen Wert der Aufzählung Monate
> annehmen.

Angenommen wir hätten das hier (geht jetzt um Klassen allgemein):
1
class Coord {
2
int x;
3
int y;
4
int getCoord(int x, int y);
5
}
6

7
Coord Grid;

Würde das bedeuten, dass das Objekt "Grid" nicht automatisch alle 
Variablen x, y und die Funktion getCoord(...) beinhaltet, sondern 
lediglich darauf zugreifen kann?
Gast #5441494
Lesenswert?

Guschtav G. schrieb:
> Würde das bedeuten, dass das Objekt "Grid" nicht automatisch alle
> Variablen x, y und die Funktion getCoord(...) beinhaltet, sondern
> lediglich darauf zugreifen kann?

In dem Fall ist das so, aber enum class Month definiert eine Aufzählung 
die nur in der Klasse Month sichtbar ist.
Auch wenn der Compiler dafür nur ein Int anlegt ist m=2 oder 
m=Color::red (das vielleicht auch =2 ist) ein Fehler. Und genau das 
möchte man, der Compiler soll prüfen können das eine Variable nur einen 
Wert aus der zugehörigen Aufzählung annehmen kann.
In C versucht man das durch Namenskonventionen, aber die kann der 
Compiler nicht interpretieren.
Siehe auch: 
https://stackoverflow.com/questions/18335861/why-is-enum-class-preferred-over-plain-enum
Gast #5441495
Lesenswert?

Johannes S. schrieb:
> In dem Fall ist das so, aber enum class Month definiert eine Aufzählung
> die nur in der Klasse Month sichtbar ist.
> Auch wenn der Compiler dafür nur ein Int anlegt ist m=2 oder
> m=Color::red (das vielleicht auch =2 ist) ein Fehler. Und genau das
> möchte man, der Compiler soll prüfen können das eine Variable nur einen
> Wert aus der zugehörigen Aufzählung annehmen kann.

Jetzt habe ich es endlich richtig verstanden, danke dir vielmals 
Johannes. Ich kann jetzt übrigens ruhig schlafen :-P
#5443010
Lesenswert?

Guschtav G. schrieb:
> Angenommen wir hätten das hier (geht jetzt um Klassen allgemein):
> class Coord {
> int x;
> int y;
> int getCoord(int x, int y);
> }
>
> Coord Grid;
>
> Würde das bedeuten, dass das Objekt "Grid" nicht automatisch alle
> Variablen x, y und die Funktion getCoord(...) beinhaltet, sondern
> lediglich darauf zugreifen kann?

Der Compiler reserviert Speicher für die Klassenvariablen x und y und 
die sind natürlich der Instanz Grid fest zugewiesen. getCoord(int x, int 
y) existiert hingegen für alle Instanzen der Klasse Coord nur einmal. 
getCoord() bekommt vom Compiler als ersten Parameter einen impliziten 
this-Zeiger, der auf die konkrete Klasse zeigt. Das ist auch der 
Unterschied zwischen einer Methode und einer Funktion.
#5443032
Lesenswert?

Slippin J. schrieb:
> Guschtav G. schrieb:
>> Angenommen wir hätten das hier (geht jetzt um Klassen allgemein):
>> class Coord {
>> int x;
>> int y;
>> int getCoord(int x, int y);
>> }
>>
>> Coord Grid;
>>
>> Würde das bedeuten, dass das Objekt "Grid" nicht automatisch alle
>> Variablen x, y und die Funktion getCoord(...) beinhaltet, sondern
>> lediglich darauf zugreifen kann?
>
> Der Compiler reserviert Speicher für die Klassenvariablen x und y

x und y sind keine Klassenvariablen, sondern Objektvariablen, bzw. in 
der C++ Nomenklatur non-static-member. Klassenvaribalen wären 
static-member.

> und
> die sind natürlich der Instanz Grid fest zugewiesen. getCoord(int x, int
> y) existiert hingegen für alle Instanzen der Klasse Coord nur einmal.
> getCoord() bekommt vom Compiler als ersten Parameter einen impliziten
> this-Zeiger, der auf die konkrete Klasse

Nein, der this-Zeiger zeigt auf das Objekt, d.h. das Exemplar oder die 
Instanz der Klasse.

> zeigt. Das ist auch der
> Unterschied zwischen einer Methode und einer Funktion.

In C++ sagt man auch nicht Methode, sondern Elementfunktion (member 
function) bzw. freie Funktion (free function), wenn sie ausserhalb einer 
Klasse sind.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren