Enum Problem

BLR

Erfahrenes Mitglied
Hallo zusammen,

irgendwie verstehe ich nicht, warum folgende Sache nicht funktioniert.

Code:
enum Wochentage {
    montag,
    dienstag,
    mittwoch,
    donnerstag,
    freitag,
    samstag,
    sonntag
};

int main(int argc, char** argv) {

        Wochentage wTage;
        string wochentag;
        cin >> wochentage; // ich gebe "montag" ein

            if (wTage.montag== wochentage) {
            
                //tue was...
            
         }              
}

Und da kommt der Fehler:
main.cpp: error: request for member ‘montag’ in ‘wTage’, which is of non-class type ‘Wochentage’

}

Warum sieht er "montag" nicht als Member in dem Enum "Wochentage" an****?
Danke für jeden Tipp.
 
Hallo,

"enum" ist immer numerisch; du kannst es nicht mit einem String zusammenwürfeln. Ohne explizite Zuweisung hat "montag" den Wert "0".

Gruß
MCoder
 
Ein weiterer Fehler ist, dass du in Zeile 15 und Zeile 17 auf einmal mit der Variable "wochentage" arbeitest, es gibt aber nur ein "string wochentag".

Und der Grund warum du den Compilierfehler bekommst: wTage ist ein Objekt vom Typ Wochentage. In wTage kannst du also einen Tag (z.B. montag) speichern. Ein treffenderer Name wäre also wTag.
Du kannst von wTag aus also auch nicht auf die Tage zugreifen, die Tage sind nur mögliche Werte für wTag.
Wenn du einen Tag haben möchtest, schreibst du einfach "montag", da die Konstanten im enum global sind.
Möchtest du einen Zugriff, wie du ihn dir vorstellst, musst du folgendes schreiben:
C++:
enum class Wochentage {MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG};

.
.
.

Wochentage zahltag = Wochentage.MONTAG;

Konstanten schreibt man normalerweise in Großbuchstaben (vor allem wenn es sich um globale handelt), deshalb habe ich die jetzt mit Großbuchstaben geschrieben.

Lg
 
Hallo und danke für die interessanten Antworten.
Also ich möchte einfach eine Eingabe mit den Wochentagen vergleichen.
Dafür zu schreiben:
if ("montag" == eingabe)
wollte ich nicht.

Leider bringt er mir den selben Fehler, wenn ich statt einem Vergleich eine Zuweisung mache, wie der vorherige Post es mir vorschlägt:
Code:
Wochentage zahltag = Wochentage.MONTAG;

noch bringt es irgendwas, wenn ich den ersten Eintrag im Enum einen Wert zuweise, was mich auch nicht verwundert, weil man im Enum die Werte nicht unbedingt durchnummerieren muss, es sei den, man will nicht von 0 beginnen...
Also...

Wie könnte man den Ausdruck:
if ("montag" == eingabe)
mit Enum umsetzen****?
 
Also mein Codebeispiel war jetzt nur ein Beispiel, weil ich dich noch auf andere Fehler hinweisen wollte. Wie MCoder schon sagte: Ein enum kann nur ganzzahlige Werte speichern. So etwas wie du möchtest funktioniert so leider nicht.

Lg
 
Hallo,

direkt mit enum wirst du nicht arbeiten können, da wie MCoder schon sagte enums vom Typ int sind. Schau dir dazu nochmal an was enums eigentlich und wie sie funktionieren.
Du kannst da aber nen Workaround nutzen mit:

C++:
static std::string strTage[7] = {"Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };

	enum wochentage { montag, dienstag, mittwoch, donnerstag, freitag, samstag , sonntag } we;

	std::string eingabe;
	if(strTage[montag] == eingabe) {
...
	}

Ist jetzt ungetestet, sollte aber funktionieren. Allerdings fragt sich dabei ob der Mehraufwand nötig ist.

Grüße,
Jennesta
 
Danke dir sehr für den Vorschlag.
Hört sich gut an.

Ich habe jetzt aus neugier mal den "montag" mit der Zahl 0 vergliechen, dennoch kommt dieser Fehler.
Also der Code:
Ausserhalb der Main ist der Enum:

Tage{
montag =0,
dienstag
}

Innerhalb der Main deklariere ich
eine Variable t vom Typ "Tage".

Code:
Tage t;

dann sage ich:

Code:
if (t.montag == 0){
....
}

Dennoch kommt der Fehler:

error: request for member ‘montag’ in ‘t’, which is of non-class type ‘Tage’

Warumm****
 
Warum das t? Enums instanziiert man nicht. Mach es so wie ich oben im Beispiel. (das "we" kann man übrigens weglassen, ist quatsch.)

€edit: Man kann sie schon instanziieren, aber macht meienr Meinung nach keinen Sinn. Vorallem hier.
 
Zuletzt bearbeitet:
Hallo BLR,

wie schon gesagt, kann ein "enum" keine Strings halten. Es ist aber trotzdem ganz hilfreich, weil damit den Zahlen Namen geben und dadurch lesbareren Code erzeugen kann.
Wenn du die Texte in einen geeigneten Container packst, gibt es sogar die Möglichkeit, statt endloser if-Ketten eine übersichliche case-Struktur für Auswertung der Eingabe zu verwenden,
siehe folgendes Beispiel mit einem "set":
C++:
#include <string>
#include <iostream>
#include <set>

int main( int argc, const char* argv[] )
{
    enum Wochentage // abweichende Reihenfolge, weil "set" sortiert
    {
        dienstag,
        donnerstag,
        freitag,
        mittwoch,
        montag,
        samstag,
        sonntag
    };

    std::string days[] = { "montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag" };
    std::set<std::string> set_days(days, days + 7);

    std::string inp_day;    
    
    std::cout << "Eingabe Wochentag: "; std::cin >> inp_day;
        
    switch( std::distance(set_days.begin(), set_days.find(inp_day)) )
    {
        case montag:     std::cout << "-> Montag"     << std::endl; break;
        case dienstag:   std::cout << "-> Dienstag"   << std::endl; break;
        case mittwoch:   std::cout << "-> Mittwoch"   << std::endl; break;    
        case donnerstag: std::cout << "-> Donnerstag" << std::endl; break;
        case freitag:    std::cout << "-> Freitag"    << std::endl; break;
        case samstag:    std::cout << "-> Samstag"    << std::endl; break;
        case sonntag:    std::cout << "-> Sonntag"    << std::endl; break;
        
        default: std::cout << "ungueltige Eingabe!" << std::endl; break;
    }

    return 0;
}

Gruß
MCoder
 
Zurück