Fireplace

C++ Enum verwenden

AirForce

Lt. Junior Grade
Registriert
Okt. 2010
Beiträge
296
Habe eine klasse Book entwickelt. Jetzt habe den Aufzählungstyp eingesetzt auch im Konstruktor doch der Compiler sagt: Syntaxfehler: Bezeichner 'Genre', Überladene Memberfunktion nicht in 'Book' gefunden. Aber wieso?
Hier die Code ausschnitte mit dem Fehlern:
Die klasse
Code:
public:
      Book(string name, string name2, Genre g);
      enum Genre{
	Roman , Sachbuch, Zeitschrift, Biografie, Kinder
	};
private:
      Genre g;

Code:
Book::Book(string n, string n2, Genre g):name(n),name2(n2)
{
	if (n != n2) {
		cout << n << " " << n2 << endl;} 
	else {
		cout << "Ungueltiger name!" << endl;}
}

Book New("Das","Buch",Book::Sachbuch);
 
Hi. Pack die Enum-Deklaration vor alles, die es benutzt. ;) (Konstruktor in deinem Beispiel)

Edit:
Und in der Deklaration des Konstruktors Book::Gerne als Parametertyp angeben.

Also:
Code:
public:
      enum Genre{
	Roman , Sachbuch, Zeitschrift, Biografie, Kinder
	};
      Book(string name, string name2, Genre g);
private:
      Genre g;

Code:
Book::Book(string n, string n2, Book::Genre g):name(n),name2(n2)
{
	if (n != n2) {
		cout << n << " " << n2 << endl;} 
	else {
		cout << "Ungueltiger name!" << endl;}
}

Book New("Das","Buch",Book::Sachbuch);
 
Ok aber ich dachte der Gültigkeits Bereich in Klassen ist nicht so streng wie beim globalen Gültigkeitsbereich. Jetzt geht alles.

Jetzt ein anderes Probleme. Habe hier eine Funktion geschrieben die überprüft wann ein Buch zurück kommt. Damit die Prüfung Erfolg hat werden nur Wochentage und das Datum darf nicht mehr als 31 sein. Und da ist das Problem.
Code:
void geben(string buchname, string buchname2, string antwort, int a); // Buch Name und am welchen Wochen Tag samt Datum das Buch zurückkommt 
private:
	int a,b,c,d;
	string name, name2, vorname,antwort,autor,autor2,buchname,buchname2;
	Genre g;

Code:
void Book::geben(string b, string b2, string an, int aa)
{
	if (an != "Montag " && an != "Dienstag" && an != "Mittwoch" && an != "Donnerstag" && an != "Freitag" && aa > 31) {
		cout << "Das ausgeliehen buch" <<  " "  << "\"" << b << " " << b2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
	else {
		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
}

Code:
New.geben("Das","Buch","Montag",15);      // Für das testen
New2.geben("Ein","Buch","Samstag",30); 
Test.geben("Neues","Buch","Montag",56);
 
Zuletzt bearbeitet:
Und wo genau ist da jetzt das Problem?

P.S. Deine Überprüfung auf ein gültiges Datum solltest du dir noch mal genauer ansehen.
Ergänzung ()

Noch ein paar Vorschläge.

  • Strings und alle anderen Objekte bei denen unnötiges Kopieren vermieden werden kann, solltest du lieber per const Referenz übergeben.
  • Deine geben()-Methode benötigt den this-Pointer nicht. Also entweder zu einer statischen Methode machen oder (besser) sie ganz aus der Klasse rausnehmen.

Code:
void geben( const string& b, const string& b2, const string& an, int aa )
{
	if ( ( an != "Montag" && an != "Dienstag" && an != "Mittwoch" && an != "Donnerstag" && an != "Freitag" ) || aa > 31 )
	{
		cout << "Ungueltiger Tag oder Wochentag!" << endl;
		return;	
	}

	cout << "Das ausgeliehen buch \"" << b << " " << b2 << "\" kommt am " << an <<  " dem " << aa  << " zurueck." << endl;
}
 
Zuletzt bearbeitet:
Das Problem ist folgendes, New.geben ist OK weil alle Werte stimmen. New2.geben sollte nicht angezeigt werden weil der Tag ja ein Samstag ist und es sind nur Wochentage erlaubt. Test.geben darf auch nicht angezeigt werden weil es ja keine 56 Tag gibt. Der Fehler ist das New.geben und New2.geben die Meldung erhalte Ungültiger Tag oder Wochentag doch hingegen Test.geben angezeigt wird mit dem 56 Tag. Bei New sollte es die Werte ausgeben, bei New2 nicht (die Werte werden auch nicht ausgeben) doch Test wird ausgegeben mit dem falschen Tag .
 
Zuletzt bearbeitet:
Ja, deine Gültigkeitsüberprüfung war ein bißchen seltsam. Versuch mal die korregierte Version. ;)
 
Habe eine Korrektur gemacht. Es geht immer noch nicht. New.geben wird ausgeben das ist OK, New2.geben wird ausgeben das ist ein Fehler und Test.geben wird nicht ausgeben was wieder OK ist.
Code:
void Book::geben(string b, string b2, string an, int aa)
{
	if (an == "Montag " || an == "Dienstag" || an == "Mittwoch" || an == "Donnerstag" || an == "Freitag" || aa <= 31) {
		cout << "Das ausgeliehen buch" <<  " "  << "\"" << b << " " << b2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
	else {
		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
}

Code:
New.geben("Das","Buch","Montag",15);
New2.geben("Ein","Buch","Samstag",30);
Test.geben("Neues","Buch","Montag",56);
So gehts auch nicht
Code:
void Book::geben(string b, string b2, string an, int aa)
{
	if (an == "Montag " || an == "Dienstag" || an == "Mittwoch" || an == "Donnerstag" || an == "Freitag" || aa < 32) {
		cout << "Das ausgeliehen buch" <<  " "  << "\"" << b << " " << b2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
	else {
		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
}
 
Zuletzt bearbeitet:
AirForce schrieb:
So gehts auch nicht
Hast du auch mal hinterfragt wieso?
Code:
wenn( wetter == "regnerisch" || wetter == "sonnig" || wetter == "stürmisch" || du == "mensch" )
Was kommt da wohl raus? Du = Mensch trifft immer zu, also ist die komplette restliche Bedingung irrelevant.

Übrigens: Pack die Tage in ein enum - strings sind zweckfrei bei aufzählbaren Mengen.
Code:
enum Wochentag { Montag = 0, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag };
void Book::geben(string b, string b2, Wochentag an, int aa)
{
	if ( an >= Montag && an <= Freitag && aa < 32) {
		cout << "Das ausgeliehen buch" <<  " "  << "\"" << b << " " << b2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
	else {
		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
}
edit: Verwende aussagekräftige Variablennamen!
 
Danke für die Hilfe. Jetzt geht alles. Danke für eure Hilfe. Eine andere Frage da die Wochentage ja in einem enum ist und die nur int ausgibt könnte man etwas machen damit es in cout statt der 0 Montag steht?
Was ich meine
Code:
void Book::geben(string b, string b2, Wochentag an, int aa) 
cout << an << endl; // hier wird die 0 stehen
Das wird dann ausgegeben
0
Doch statt 0 sollte Montag stehen
 
AirForce schrieb:
Eine andere Frage da die Wochentage ja in einem enum ist und die nur int ausgibt könnte man etwas machen damit es in cout statt der 0 Montag steht?
Nein, aber du könntest einen kleinen Wrapper basteln.
Code:
string WochentagToString( Wochentag t )
{
  switch( t )
  {
    case Montag : return "Montag";
    case Dienstag : return "Dienstag";
    case Mittwoch : return "Mittwoch";
    case Donnerstag : return "Donnerstag";
    case Freitag : return "Freitag";
    case Samstag : return "Samstag";
    case Sonntag : return "Sonntag";
    default : return "";
  }
}
Dein Vorhaben würde in C# funktionieren, in C(++) leider nicht.
 
Yuuri schrieb:
Dein Vorhaben würde in C# funktionieren, in C(++) leider nicht.

Na ja, mit einem bißchen syntaktischen Zucker gäbe es schon eine Möglichkeit. :)

Code:
enum Wochentag
{
	MONTAG,
	DIENSTAG,
	MITTWOCH,
	DONNERSTAG,
	FREITAG,
	SAMSTAG,
	SONNTAG
};

struct Wochentag_t
{
	const Wochentag tag;
	
	explicit Wochentag_t( Wochentag tag_ ) : tag( tag_ ) {}
};

std::ostream& operator << ( std::ostream& out, const Wochentag_t& welcherTag )
{
	switch ( welcherTag.tag )
	{
	case MONTAG:
		out << "Montag";
		break;
		
	case DIENSTAG:
		out << "Dienstag";
		break;
		
	case MITTWOCH:
		out << "Mittwoch";
		break;
		
	case DONNERSTAG:
		out << "Donnerstag";
		break
		
	case FREITAG:
		out << "Freitag";
		break;
		
	case SAMSTAG:
		out << "Samstag";
		break;
		
	case SONNTAG:
	default:
		out << "Sonntag";
	}
	
	return out;
}


void test()
{
	Wochentag_t heute( FREITAG );
	
	std::cout << "Heute ist " << heute << ".\n";
}

Nicht kompiliert / getestet, eventuelle Syntaxfehler sind möglich.
 
Zurück
Oben