mikrocontroller.net

Forum: PC-Programmierung C++ enum class


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Guschtav G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
...

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

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

...

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?

Autor: Johannes S. (jojos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist eine Aufzählung, m kann einen Wert der Aufzählung Monate 
annehmen.

Autor: Guschtav G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guschtav G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
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?

Autor: Johannes S. (jojos)
Datum:

Bewertung
1 lesenswert
nicht 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

: Bearbeitet durch User
Autor: Guschtav G. (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Slippin J. (gustavo_f)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.