enum typ auswählen können durch eine funktion ist möglich?

klodi

Grünschnabel
hallo !
ich habe folgendes problem
ich habe eine enum typ und soll durch ein funktion ein wert auswählen aber ich krige nicht hin
enum Farbe { rot,gruen,blau ,gelb};

class Auto{ private :[....]
public:[....]

}

ich versuche mit folgendes funktion
PHP:
void farbe_eingeben(Auto &a){


     unsigned short int auswahl;

    cout << "geben sie eine Farbe ein\n "
      <<"1-rot\n"
      <<"2-gruen\n"  
      <<"3-blau\n"  
       <<"0-Sonstiges\n"  ;  
    cin >> auswahl;
    if(auswahl=='1'){
                     a.farbe(rot);
                     }
    if(auswahl=='2'){
                     a.farbe(gruen);
                     }
    if(auswahl =='3'){
               a.farbe(gelb);
               }
    
    
   if (auswahl < 0 || auswahl > 9 ) {
        cout << "Falsche Eingabe! Bitte Wiederholen![ ]\b\b";
        cin >> auswahl;
    }
    //auswahl == 1 ? p.geschlecht(maennlich):p.geschlecht(weiblich);
    else{
         }

}



// und dann muss das Farbe ausgegeben 
//

	for(unsigned int i=0; i<autos.size(); ++i){ 
        cout	<< setw(4)  << left << i+1				<< setw(8)  << left << autos[i].id()				<< setw(6) << left << konstruiereDatum(autos[i])<<" "
				<< setw(17) << left << autos[i].beschreibung()
		<< setw(11) << left << (autos[i].farbe() == (switch(farbe){
                    case '0': cout <<"rot" <<endl; ; break;
                    case '1': cout<<" gruen"<<endl; ;break;
                    case '2': cout<<"gelb"<<endl; break;
                    default : cout <<" "<<endl;
                    };))
//diese auswal geht wunderbar so mit zwei möglichkeiten 

void Geschlecht_eingeben(Person &p){

    unsigned short int auswahl;

    cout << "\nGeschlecht [1]=maennlich [2]=weiblich): [ ]\b\b";
    cin >> auswahl;
    while (auswahl < 1 || auswahl > 2 ) {
        cout << "Falsche Eingabe! Bitte Wiederholen!\nGeschlecht [1]=maennlich [2]=weiblich): [ ]\b\b";
        cin >> auswahl;
    }
    auswahl == 1 ? p.geschlecht(maennlich):p.geschlecht(weiblich);

}


for(unsigned int i=0; i<personen.size(); ++i){ 
        cout	<< setw(8)  << left << i+1 // LfdNr
				<< setw(8)  << left << personen[i].id() //Primaerschluessel aus Tabelle Persondaten
				<< setw(16) << left << personen[i].nachname()
				<< setw(16) << left << personen[i].vorname()
				<< setw(11) << left << (personen[i].geschlecht() == maennlich ? "maennlich" : "weiblich")
				<< setw(10) << left << konstruiereDatum(personen[i])
				<< endl;
    }

ich habe ein paar tage die denke wie ich diese problem löessen kann aber es hat keine versuch geklappt trodz viele
könnt ihr mir bitte sagen was ich falsch mache
oder eine idee geben wie das machen kann

danke im Voraus
MFG
lodi
 
Hi.

Dein Vergleich kann so nicht funktionieren. Du vergleichst "Äpfel mit Birnen", bzw. einen unsigned short mit einem char.

Du solltest eher so vergleichen:
C++:
if (auswahl == 2) {

Dann ist es eigentlich einfacher dafür eine switch-Anweisung zu verwenden. Aber, da die Farben des enum Typs "Farbe" auch einen Wert haben, könnte man die ganze Sache noch vereinfachen:
C++:
cout << "geben sie eine Farbe ein\n "
       << rot << "-rot\n"
       << gruen << "-gruen\n"  
       << blau << "-blau\n" 
       << "0-Sonstiges\n";

cin >> auswahl;

switch (auswahl) {
case rot:
case gruen:
case blau:
  a.farbe(static_cast<Farbe>(auswahl));
  break;

default:
  cerr << "Fehlerhafte Eingabe." << endl;
}
Gruß

\edit: Du solltest allerdings bei der Definition der des enum Farbe explizit Werte für die einzelnen Farben festlegen:
C++:
enum Farbe { rot = 1, gruen = 2, blau = 3 };
 
Zuletzt bearbeitet:
danke für die antwort es funktioniret prima
aber icha habe ein anderes problem die werte werden eingefügt aber zu lesen kann ich nicht
mit zwei werte geht das klar
Code:
<< setw(11) << left << (personen[i].geschlecht() == maennlich ? "maennlich" : "weiblich")

ich weis das mann der vergleicht operator durch if else || switch erzetzen kann aber wenn ich es probiere kommt fehler meldung
ich muss da ein funktion einlegen aber ich weiss nächmlich nicht wie das einbinde
Code:
 void farbe (Farbe f ){  //das enum tym
     
      switch(f){
                case 1: "rot" ; break;
                case 2:  " gruen "; break;
                case 3: "blau"; break;
                deafult :
                }
      }
void autos_ausgeben(Autos &autos){

for(unsigned int i=0; i<autos.size(); ++i)

<< setw(11) << left << (autos[i].farbe() )<< endl ;  hier soll die funktion eingebindent 
 // mit 2 geht das 
<<setw(11) << left << (autos[i].farbe() == rot ? "rot": "blau")

}

ich habe keine ide wie man das macht ,trotz das ich in viele bücher gesucht habe habe nichts ähnliches gefunden

danke für jede antwort

mfg
lodi
 
Zuletzt bearbeitet:
Hi.

Probiers mal so:
C++:
class Auto {
  ...
  const char* farbe();
};
...
const char* Auto::farbe() {
  switch (m_farbe) { /* Name des Attributes einsetzen */
  case blau:
    return "blau";

  case gruen:
    return "gruen";

  case gelb:
    return "gelb";
  }
}

Auto a;

cout << a.farbe() << endl;
Gruß
 
hi
soll ich den enum typ weg lassen weil ich ein Enum typ deklariert habe ?
danke im voraus
mfg
lodi

ps : ich bin mich verdamt viel in diese problem gesessen und trotz nicht erfolgreich
 
ich habe gemeint da enum und const char aber kein prob

const char *farbe(); ist (+)methode von class Auto // meinst du oder ?


attribut habe ich private : Farbe farbe_; //name farbe_vom typ Farbe (enum-typ)

public: Auto(Farbe f = rot ) // hier meinst du Auto (const char *farbe_):
: farbe_(f) { }

virtual ~Auto() {}

Farbe farbe() const {
return farbe_; // hier beim get meinst du soll getauscht
}
void farbe(Farbe f) {
farbe_ = f;
}


mfg
lodi
 
Hi.

Bitte versuche mal deine Beitrage wenigstens in einer ordentlichen Form abzulieferen, wenn es dir schon nicht möglich ist gut deutsch zu sprechen. Vor allen Dingen verwende bitte auch weiterhin die Code-Tags.

ich habe gemeint da enum und const char aber kein prob

const char *farbe(); ist (+)methode von class Auto // meinst du oder ?
Ja, const char* farbe() soll eine Methode der Klasse Auto sein. Das ging allerdings doch aus deinem Beitrag hervor.

attribut habe ich private : Farbe farbe_; //name farbe_vom typ Farbe (enum-typ)

public: Auto(Farbe f = rot ) // hier meinst du Auto (const char *farbe_):
Nein, das meine ich nicht.

Ich hatte nicht verstanden was du eigentlich willst. Es sah für mich so aus, als ob du die Farbe eines Autos als String ausgeben willst. Du mußt wirklich versuchen, das was du willst anhand von Beispielen deutlich zu machen.

Gruß
 
hi !
die ausgabe soll so aussehn
Code:
id        makre          farbe       preis
2        porsche        rot           3000.00 €

ich soll ein program entwickeln das mit ein datenbank mySql komuniziert

beispiel mit zwei werte

pers.h
PHP:
enum Geschlecht {
    maennlich,
    weiblich
};
class Person {
private:   Geschlecht geschlecht ;   //ich schreibe nur das wo problem gibt weil ist ziemlich viel quellcode und wird nimand lesen 
public : Person (Geschlecht g = maennlich)    :geschlecht_(g) {}
virtual   ~Person (){}
    
 Geschlecht geschlecht() const {
        return geschlecht_;
    }
    void geschlecht(Geschlecht g) {
        geschlecht_ = g;
    }  

};
perstab.cpp


const std::string PersonenTabelle::spaltennameGeschlecht(){
	// siehe Kommentar in PersonenTabelle::spaltennamePersID()
	return "Geschlecht";
}

 while ((zeile = mysql_fetch_row (mysql_res)) != NULL) {
        // Einzelne Spalten einer Zeile der Tabelle Personendaten in Person abbilden
        Person p;
        for (unsigned int i = 0;  i < mysql_num_fields(mysql_res); ++i){

            switch(i) {
            case 0: p.id(std::atoi(zeile[i]));
                break;
            case 1: p.nachname(zeile[i]);
                break;
            case 2: p.vorname(zeile[i]);
                break;
            case 3: strcmp(zeile[i], "maennlich")== 0 ? p.geschlecht(maennlich) : p.geschlecht(weiblich);
                break;
            case 4: zerlegeDatum(p, zeile[i]);
                break;
            default: throw sql_exception("Aenderung der Tabellendefinition von \"Personendaten\" fuehrte zu Integritaetsverletzung.");
            }
        }

// hier ist die ausgabe 
void Person_ausgeben(const Personen &personen){
    // konstruiere Tabelle
    cout	<< endl
			<< setw(8)  << left << "LfdNr"
			<< setw(8)  << left <<  pt->spaltennamePersID()
			<< setw(16) << left << pt->spaltennameNachname()
			<< setw(16) << left << pt->spaltennameVorname()
			<< setw(11) << left << pt->spaltennameGeschlecht()
			<< setw(10) << left << pt->spaltennameGeburtsdatum()
			<< endl
			<< endl;
    // gib jede Person als einzelne Zeile dieser Tabelle aus
	for(unsigned int i=0; i<personen.size(); ++i){ 
        cout	<< setw(8)  << left << i+1 // LfdNr
				<< setw(8)  << left << personen[i].id() //Primaerschluessel aus Tabelle Persondaten
				<< setw(16) << left << personen[i].nachname()
				<< setw(16) << left << personen[i].vorname()
				<< setw(11) << left << (personen[i].geschlecht()== maenlich ? "maenlich":"weiblich"
				<< setw(10) << left << konstruiereDatum(personen[i])
				<< endl;
    }
}

und ich will statt
PHP:
<< setw(11) << left << (personen[i].geschlecht()== maenlich ? "maenlich":"weiblich"
eine funktion die mehr als 2 werte annihmt wie werden sie es machen wenn sie nagenomen" 5 werte in geshlecht hätten" d.h nicht nur mänlich und weiblich sondern noch drei "angenomen".

danke für deine antworten
mfg
lodi
 
Zuletzt bearbeitet:
Hi.
hi !
die ausgabe soll so aussehn
Code:
id        makre          farbe       preis
2        porsche        rot           3000.00 €

ich soll ein program entwickeln das mit ein datenbank mySql komuniziert

beispiel mit zwei werte

pers.h
PHP:
enum Geschlecht {
    maennlich,
    weiblich
};
class Person {
private:   Geschlecht geschlecht ;   //ich schreibe nur das wo problem gibt weil ist ziemlich viel quellcode und wird nimand lesen 
public : Person (Geschlecht g = maennlich)    :geschlecht_(g) {}
virtual   ~Person (){}
    
 Geschlecht geschlecht() const {
        return geschlecht_;
    }
    void geschlecht(Geschlecht g) {
        geschlecht_ = g;
    }  

};
perstab.cpp


const std::string PersonenTabelle::spaltennameGeschlecht(){
	// siehe Kommentar in PersonenTabelle::spaltennamePersID()
	return "Geschlecht";
}

 while ((zeile = mysql_fetch_row (mysql_res)) != NULL) {
        // Einzelne Spalten einer Zeile der Tabelle Personendaten in Person abbilden
        Person p;
        for (unsigned int i = 0;  i < mysql_num_fields(mysql_res); ++i){

            switch(i) {
            case 0: p.id(std::atoi(zeile[i]));
                break;
            case 1: p.nachname(zeile[i]);
                break;
            case 2: p.vorname(zeile[i]);
                break;
            case 3: strcmp(zeile[i], "maennlich")== 0 ? p.geschlecht(maennlich) : p.geschlecht(weiblich);
                break;
            case 4: zerlegeDatum(p, zeile[i]);
                break;
            default: throw sql_exception("Aenderung der Tabellendefinition von \"Personendaten\" fuehrte zu Integritaetsverletzung.");
            }
        }

// hier ist die ausgabe 
void Person_ausgeben(const Personen &personen){
    // konstruiere Tabelle
    cout	<< endl
			<< setw(8)  << left << "LfdNr"
			<< setw(8)  << left <<  pt->spaltennamePersID()
			<< setw(16) << left << pt->spaltennameNachname()
			<< setw(16) << left << pt->spaltennameVorname()
			<< setw(11) << left << pt->spaltennameGeschlecht()
			<< setw(10) << left << pt->spaltennameGeburtsdatum()
			<< endl
			<< endl;
    // gib jede Person als einzelne Zeile dieser Tabelle aus
	for(unsigned int i=0; i<personen.size(); ++i){ 
        cout	<< setw(8)  << left << i+1 // LfdNr
				<< setw(8)  << left << personen[i].id() //Primaerschluessel aus Tabelle Persondaten
				<< setw(16) << left << personen[i].nachname()
				<< setw(16) << left << personen[i].vorname()
				<< setw(11) << left << (personen[i].geschlecht()== maenlich ? "maenlich":"weiblich"
				<< setw(10) << left << konstruiereDatum(personen[i])
				<< endl;
    }
}

und ich will statt
PHP:
<< setw(11) << left << (personen[i].geschlecht()== maenlich ? "maenlich":"weiblich"
eine funktion die mehr als 2 werte annihmt wie werden sie es machen wenn sie nagenomen" 5 werte in geshlecht hätten" d.h nicht nur mänlich und weiblich sondern noch drei "angenomen".
Das hatte ich doch aber schon in meinem letzten Beispiel demonstriert wie die Funktion aussehen kann. Aber es gibt natürlich mehrere Möglichkeiten.

Ich würde eine Methode zur Klasse hinzufügen, die einen entsprechenden Text liefert:
C++:
const char* Person::str_geschlecht() const {
  switch (geschlecht_) {
  case maennlich:
    return "maennlich";

  case weiblich:
    return "weiblich";

  case beides:
    return "eeeeek";
  }
}
...
Person p;
cout << p.str_geschlecht() << endl;
Die Form deines Beitrages ist jetzt übrigens viel besser. :)

Gruß
 
Zuletzt bearbeitet:
Zurück