enum in c++

BLR

Erfahrenes Mitglied
Hallo zusammen,

ich hatte zwar schon ne Frage wegen in Enum, aber in c++ kapiere ich gar net wie das funktionieren soll.
also:

in der Header-Datei ist im public bereich ein enum Auto = {mercedes=1, opel=2} definiert.
im private bereich ist eine Variable vom typ Auto deklariert.
Die Klasse heisst: auto.

Im Construktor sage ich einfach:
Code:
class auto{
public:
    enum Auto{ mercedes=1, opel }; // symbol. Konstanten für die Monate
   
    auto();
    auto(int tuer, Month month, int reifen);
   

private:
    int tuer;
    auto m;
    int reifen;
    
};

In der .cpp Datei impelementiere ich das:

Code:
auto::auto(int tt, auto aa, int rr=0) {

    tuer=tt;
    auto=aa;
    reifen=rr;

}

so und nun kommen die Probleme beim Instanzieren.

1.
das funktioniert:
auto meinAuto(yy,auto::eek:pel,dd);
2.
das funktioniert nicht:
auto meinAuto(yy,auto::Auto.opel,dd);
warum********
3.
Eigentlich will ich nur eine Zahl eingeben, also entweder 0 oder 1.
und sagen:
auto meinAuto(yy,1,dd);
Dann soll halt "opel" ausgewählt werden.
Klar ist "1" nciht vom Typ "Auto", aber ich kann ja auch nicht "opel" von Aussen schreiben.

Wie kann ich von aussen bestimmen, welchen Enum-Wert ich nehmen muss****
Etwa nur mit:

if 1 dann enum.opel?
 
Hallo,

wo ist der Typ "Month", den du im Konstruktor nutzt?

Außerdem würde ich vom Namen "auto" abraten! Das ist ein Schlüsselwort in C++11! Das könnte definitiv zu Fehlern und Misinterpretationen seitens des Compiler führen.
 
Hi.

"Normale" Enums laut (altem) C++ Standard definieren keinen eigenen Skopus für die Mitglieder:

C++:
enum test1 { eins, zwei, drei };
enum test2 { eins, zwei, drei }; // FEHLER

Insbesondere kann man auch nicht schreiben:
C++:
int x = test1.eins;
(wobei hier eigentlich der Skopus Operator :: gemeint war und nicht der Selektionsoperator)

In C++11 gibt es typsichere Enums (enum Klassen). Da ist das denn anders.

Wenn du eine Eingabe vornehmen willst, dann mußt du von int zum enum konvertieren. Ich halte es aber für keine gute Idee int als Parametertyp zu verwenden.
C++:
int choice = ...;
auto::Auto typ;

switch (choice) {
case auto::mercedes:
  typ = auto::mercedes;
  break;
case auto::opel:
  typ = auto::opel;
  break;
default;
  ... // Fehler: unbekannter Typ
}

auto neu(.., typ, ...);

PS: auto ist auch in C ein Schlüsselwort.
 
wo ist der Typ "Month", den du im Konstruktor nutzt?
Ups... sorry, das war ein altes Beispiel.
Denkt euch einfach anstatt "auto" zum Beispiel Fahrzeug.

Wie kann ich die Eingabe "int (1)" auf die Enum -Wert der den ersten Index hat konvertieren****?

Ausserdem machen mcih die Getter und Setter in c++ wahnsinnig.

im privaten Bereich der Header-Datei sind z.b folgende Variablen:

Code:
private:
int zahl1(0);
bool wert(false);

und im Public-Bereich:
Code:
public:
inline int getZahl const (){
       return zahl1;
}

inline bool getWert const (){
       return Wert;
}

void setZahl(int zahl);
void setWert(bool wert);

Nun möchte ich aber in der .cpp die privaten Variablen "zahl1" und "wert" aus einer globalen Funktion,
die nicht in der Header-Datei innerhalb von "class" deklariert ist, Werte setzen.
Also die globale Methode, die nicht an der Klasse hängt:
Header-Datei:

Code:
bool check_leap_year(int year);

class Fahrzeug{
public:
      void setZahl(int zahl);
      void setWert(bool wert);
inline int getZahl const (){
       return zahl1;
}

inline bool getWert const (){
       return Wert;
}

private:
int zahl1(0);
bool wert(false);

dann will ich in der cpp. Datei darauf zugreifen:

Namensraum::Methode
also:
fahrzeug::setWert(bool wert);

leider wird mir nach "fahrzeug::" meine setWert-Methode nicht angezeigt.....wtf****
 
dann will ich in der cpp. Datei darauf zugreifen:

Namensraum::Methode
also:
fahrzeug::setWert(bool wert);

leider wird mir nach "fahrzeug::" meine setWert-Methode nicht angezeigt.....wtf****
Man kann Methoden nur aufrufen, wenn man eine Instanz der Klasse erstellt hat.

Nur statische Methoden lassen sich über KlassenName::Funktionsname aufrufen.
 
Zurück