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
enumclassMonth{
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
Monthm=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?
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.
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
classCoord{
2
intx;
3
inty;
4
intgetCoord(intx,inty);
5
}
6
7
CoordGrid;
Würde das bedeuten, dass das Objekt "Grid" nicht automatisch alle
Variablen x, y und die Funktion getCoord(...) beinhaltet, sondern
lediglich darauf zugreifen kann?
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
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
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.
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.