Forum: PC-Programmierung C++ enum class


von Guschtav G. (Gast)


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?

von Johannes S. (Gast)


Lesenswert?

Es ist eine Aufzählung, m kann einen Wert der Aufzählung Monate 
annehmen.

von Guschtav G. (Gast)


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.

von Guschtav G. (Gast)


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?

von Johannes S. (Gast)


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

von Guschtav G. (Gast)


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

von Slippin J. (gustavo_f)


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.

von Wilhelm M. (wimalopaan)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.