C++ enum aus struct ansprechen

d0zer

Lt. Commander
Registriert
Aug. 2007
Beiträge
1.034
Hallo liebe Community,

hoffentlich, ist der titel nicht falsch gewählt, da ich es nicht besser beschreiben kann.

ich will eine schulklasse programmieren mit schülern, die vorname, name, geburtsdatum und geschlecht haben.

ich weiss nicht, wie ich enums (datum und geschlecht) anspreche und übergebe. in meinem beispiel sind das monate und das geschlecht (m oder w).

hoffentlich könnt ihr was mit meiner beschreibung anfangen. es würde reichen, wenn ich das datum im format "12 Apr 1989" eingeben kann. daraus könnte ich dann auf die auswahl des geschlechtes schliessen.

Vielen Dank schon mal


Code:
#include <cstdlib>
#include <iostream>
using namespace std;

/*
 *
 */
int main() {


    //Monate
    enum Monat {
        Jan = 1, Feb, Mrz, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez
    };
   


    //Datum
    struct Datum {
        short tag;
        enum Monat mon;
        unsigned int jahr;
    };


    //Geschlecht
    enum Art {
        m, w
    };
 

    //Personendaten
    struct Person {
        string vorname, name;
        enum Art geschlecht;
        struct Datum geburtsdatum;

    };

    const int max = 10; //Maximal 10 Schüler möglich
    Person klasse[max];
    int n; //Variable für die Anzahl der Schüler


    //Anlegen von Schülern
    cout << "Wieviele moechten sie Schueler anlegen? " << endl;
    cin >> n;
    cout << "Sie wollen " << n << " Schueler anlegen " << endl;

    //Schleife um Daten für jeden Schüler abzufragen
    for (int i = 0; i < n; i++) {
        cout << "-------------------------" << endl;
        cout << "Bitte Vornamen eingeben: " << endl;
        cin >> klasse[i].vorname;
        cout << endl;

        cout << "Bitte Nachnamen eingeben: " << endl;
        cin >> klasse[i].name;
        cout << endl;

        //So wollte ich auf das Geschlecht zugreifen aber die Eingabe von Geschlecht (enum) funktioniert nicht
        //        cout << "Bitte das Geschlecht angeben: " << endl;
        //        cin >> klasse[i].geschlecht;

        cout << "Bitte Geburtstdatum eingeben(Monat): " << endl;

        //So wollte ich auf das Geschlecht zugreifen aber die Eingabe von Datum Monat (enum) funktioniert nicht
        //cout << "Bitte Geburtstdatum eingeben( Tag & Monat & Jahr): " << endl;
        //cin >> klasse[i].geburtsdatum.tag >> klasse[i].geburtsdatum.mon >> klasse[i].geburtsdatum.jahr;
        cout << endl;

        cout << "-------------------------" << endl;
        cout << endl;

    }


    //Schleife um Daten für jeden Schüler auszugeben
    for (int i = 0; i < n; i++) {
        cout << klasse[i].vorname << endl;
        cout << klasse[i].name << endl;

        //Ausgabe von Datum, wegen Monat (enum) und Geschlecht (enum) funktioniert nicht
        //cout << klasse[i].geburtsdatum.tag << klasse[i].geburtsdatum.mon << klasse[i].geburtsdatum.jahr;
        //cout << klasse[i].geschlecht;
    }



    //Ende
    return 0;
}
 
Für den Compiler sind deine Enumwerte in der Regel nichts weiter als int-Werte. Um das Konvertieren der Benutzereingaben in die entprechenden Enumwerte mußt du dich leider selbst kümmern. C++ stellt diesbezüglich keine Automatismen zur Verfügung. Also z.B. den Benutzer den Monat in einen String eingeben lassen und dann ...

Code:
Monat stringToMonatEnum( const std::string& monatString )
{
    if ( monatString == "Januar" )
    {
        return Jan;
    }

    if ( monatString == "Februar" )
    {
        return Feb;
    }

    // und so weiter ...
}
Ergänzung ()

Du brauchst übrigens bei der Deklaration einer Enum-Variablen nicht jedes mal das enum davorschreiben. Für struct gilt das gleiche.

Code:
struct Datum geburtsdatum;
enum Art geschlecht;

// so geht's auch
Datum geburtsdatum;
Art geschlecht;
 
falls du ganz dolle dinge mit enums machen möchtest, schau mal hier vorbei und zieh dir den source.

beispiel:
Code:
#include "EnumClass.h"

#define ENUMMONTH \
{ \
	Januar = 1, \
	Februar, \
	..usw..
	Dezember \
}


DECLARE_ENUM(EnumMonthClass, EnumMonth, ENUMMONTH);
IMPLEMENT_ENUM(EnumMonthClass);

ab dieser stelle steht dir EnumMonth und EnumMonthClass zur verfügung. daraus kannst dann dinge wie diese hier machen:

Code:
int _tmain(int argc, wchar_t* argv[])
{
// diese ausgabe wird dir aus dem string die enum-zahl 12 zurückliefern.
	std::cout << EnumMonthClass ("Dezember") << std::endl;		
}

weitere beispiele sind im source selbst drin. fand ich damals sehr brauchbar um enums durchzuiterieren, was ebenfalls im beispielcode gezeigt wird.
 
Zurück
Oben