Klasse als Attribut einer anderen Klasse
-
Klasse als Attribut einer anderen Klasse
Hallo zusammen,
bin noch ziemlich am Anfang der objetorientierten Programmierung in C++ und schreibe gerade an einem Programm, in welchem Studenten in Kurse eingetragen werden können. Die Kurse können dann
wiederrum mit Informationen über alle teilnehmenden Studenten in der Konsole ausgegeben werden.Ich habe jetzt also meine beiden Klassen student und kurs wie folgt initialisiert:
class student{ //Deklaration der Klassen-Attribute private: string name, vorname, hochschule; int matnr; bool intern; public: void new_student(string n, string vn, string hs, int nr, bool in){ //Methode zur Anlage eines neuen Studenten mit Übergabeparametern name = n; vorname = vn; hochschule = hs; matnr = nr; intern = in; } //Getter-Methoden [...] }; class kurs{ //Deklaration der Klassen-Attribute private: string name; int kursnr; //eindeutige Ident-Nr eines Kurses int teilnehmerzahl; student teilnehmer[10]; public: kurs(string n, int nr):teilnehmerzahl(0){ //Deklaration u. Definition des Konstruktors mit ELI für Defaultwert name = n; kursnr = nr; } //Getter-Methoden [...] //Methode zur Aufnahme eines Studenten void student_aufnehmen(student s){ if(teilnehmerzahl < 10){ teilnehmerzahl++; cout << "Sie wurden erfolgreich in den Kurs eingetragen!"; } else{ cout << "Kurs ist voll!"; } } };Mein Problem liegt nun bei der Methode student_aufnehmen(), welche einen Studenten einem Kurs zuordnen soll. Klar, aktuell passiert in der Methode nicht viel, nur scheiterten alle meine bisherigen versuche am Compiler.
Mein Ansatz wäre gewesen: in der Klasse Kurs als Attribut ein Array teilnehmer[10] vom Datentyp Student aufzunehmen (max. 10 Telnehmer pro Kurs). In der Methode student_aufnehmen() sollte dann dem Attribut (z.B. teilnehmer[0]) ein Studenten-Objekt zugewiesen werden. Meines Wissens nach ist es doch möglich, nachdem man eine Klasse deklariert hat, diese auch in anderen Klassen wie einen Datentyp zu behandeln, oder? Ich bekomme mit obigem Code jedenfalls folgenden Compiler-Fehler:
[Error] 'student' does not name a typeKann mir jemand weiterhelfen, was ich hier übersehen habe bzw. wo der Denkfehler liegt? Habe schon einige Zeit rumprobiert und bekomm es nicht hin.
Dankeschön & Viele Grüße
-
So wie du es beschreiben hast müsste es eigentlich funktionieren. Wie hast du die
studentundkursKlasse in Dateien aufgeteilt? Für beides einen Header? Dann musst du in der kurs.h (oder wie auch immer die bei dir heißt) natürlich auch die student.h laden sonst kennt er diestudentKlasse nicht.
-
Daran wirds wohl nicht liegen, habe den ganzen Code in einer Datei.
-
Dann hast du wohl nicht den ganzen relevanten Code gezeigt. Dein Beispiel + Includes und main Funktion compiliert bei mir. In welcher Zeile erhälst du die Fehlermeldung? Welchen Compiler nutzt du?
-
Also als Compiler benutze ich Dev-C++ von Bloodshed.
Hab jetzt auch einfach mal zum Test nur den von mir angegeben Code übersetzt, hat auch funktioniert. Also muss der Fehler tatsächlich woanders liegen, kann mir aber jetzt nicht vorstellen wo.
#include <iostream> #include <string> #include <cstdlib> using namespace std; //Deklaration der benötigten Klassen class student{ //Deklaration der Klassen-Attribute private: string name, vorname, hochschule; int matnr; bool intern; public: void new_student(string n, string vn, string hs, int nr, bool in){ //Methode zur Anlage eines neuen Studenten mit Übergabeparametern name = n; vorname = vn; hochschule = hs; matnr = nr; intern = in; } //Getter-Methoden zur Ausgabe der Studentendaten string get_name(){ return name; } string get_vorname(){ return vorname; } string get_hochschule(){ return hochschule; } int get_matnr(){ return matnr; } bool get_intern(){ return intern; } }; student student[30]; //Feld zur Speicherung aller Studentendaten (max 30, da 3 Kurse mit max. 10 Studenten) class kurs{ //Deklaration der Klassen-Attribute private: string name; int kursnr; //eindeutige Ident-Nr eines Kurses int teilnehmerzahl; student teilnehmer[10]; public: kurs(string n, int nr):teilnehmerzahl(0){ //Deklaration u. Definition des Konstruktors mit ELI für Defaultwert name = n; kursnr = nr; } //Getter-Methoden zur Ausgabe der Kursdaten string get_name(){ return name; } int get_kursnr(){ return kursnr; } int get_teilnehmerzahl(){ return teilnehmerzahl; } //Methode zur Aufnahme eines Studenten void student_aufnehmen(student s){ if(teilnehmerzahl < 10){ teilnehmerzahl++; cout << "Sie wurden erfolgreich in den Kurs eingetragen!"; } else{ cout << "Kurs ist voll!"; } } }; //Funktionen fuer einzelne Menüpunkte //Menüpunkt 1 void mp1(){ //Deklaration der lokalen Eingabeparameter string n, vn, hs; int nr; bool in; static int i = 0; //Laufindex für Studenten int auswahl; //Variable für Kurswahl //Dialog zur eingabe der Studentendaten cout << endl <<"1 // Registrierung fuer einen Kurs" << endl << "**********************************" << endl << endl; cout << "Bitte nachfolgende Daten eingeben:" << endl << "Nachname: "; cin >> n; cout << "Vorname: "; cin >> vn; cout << "Sind Sie Student der THD oder einer externen Hochschule? Bitte *1* fuer THD eingeben und *0* fuer extern: "; cin >> in; if(!in){ //Eingabe der Hochschule, wenn Student extern ist cout << "Bitte Hochschule eingeben: "; cin >> hs; } else{ //Hochschule = THD, wenn Student intern ist hs = "THD"; } cout << "Matrikelnummer: "; cin >> nr; student[i].student::new_student(n, vn, hs, nr, in); //erzeugen des Studenten mit den eingegebenen Daten cout << endl << "Vielen Dank! Ihre Daten wurden in das System eingetragen (" << student[i].student::get_name() << ", " << student[i].student::get_vorname() << ", "; cout << student[i].student::get_hochschule() << ", Mat. Nr. " << student[i].student::get_matnr() << ")" << endl << endl; //Kontrollausgabe kurs k1("Programmierung", 1), k2("Datenbanken", 2), k3("Software-Engineering", 3); //Erzeugung der drei Kurse mittels Übergabeparametern an Konstruktor //Eintragung in einen Kurs cout << "Sie koennen sich nun in einen Kurs eintragen. Interne Student koennen alle Kurse belegen, externe Studenten nur einen Kurs. Es stehen die Kurse " << k1.kurs::get_name() << "(Kursnr. " << k1.kurs::get_kursnr() << "), "; cout << k2.kurs::get_name() << "(Kursnr. " << k2.kurs::get_kursnr() << ") und " << k3.kurs::get_name() << "(Kursnr. " << k3.kurs::get_kursnr() << ") zur Verfuegung. "; cout << endl << "Bitte geben Sie die Nummer des Kurses ein, in welchen Sie sich eintragen wollen: "; cin >> auswahl; switch(auswahl){ case 1: k1.kurs::student_aufnehmen(); break; case 2: k2.kurs::student_aufnehmen(); break; case 3: k3.kurs::student_aufnehmen(); break; } if(!student[i].get_intern()){ //wenn Student extern, Rückkehr ins Hauptmenü cout <<"Rueckkehr ins Hauptmenue..."; } else{ for(int i = 0; student[i].get_intern() && i < 2; i++){ //wenn Student intern, weitere zweimalige Möglichkeit zur Eintragung cout << endl << "Sie koennen sich nun in einen weiteren Kurs eintragen. Bitte geben Sie die Nummer des Kurses ein, in welchen Sie sich eintragen wollen, oder eine *0*, um in das Startmenue zurueckzukehren: "; cin >> auswahl; switch(auswahl){ case 0: i = 2; break; case 1: k1.kurs::student_aufnehmen(); break; case 2: k2.kurs::student_aufnehmen(); break; case 3: k3.kurs::student_aufnehmen(); break; } } } i++; //i wird erhöht, um im nächsten Durchlauf neuen Student anlegen zu können } //Menüpunkt 2 void mp2(){ cout << endl <<"2 // Ausgabe eines/aller Kurse mit Daten der Kursteilnehmer" << endl << "***********************************************************" << endl << endl; } //Menüpunkt 3 void mp3(){ cout << endl <<"2 // Programmende - Anzeige nicht stattfindender Kurse" << endl << "******************************************************" << endl << endl; } int main(){ int auswahl; //Auswahlvariable für Benutzermenü do{ cout << "PROGRAMM ZUR KURSVERWALTUNG" << endl; cout << "************************************************" << endl << endl; cout << "Herzlich Willkommen! Bitte durch Zahleingabe einen Menuepunkt auswaehlen:" << endl << endl; cout << "1 // Registrierung fuer einen Kurs" << endl << "2 // Ausgabe eines/aller Kurse mit Daten der Kursteilnehmer" << endl << "3 // Programmende und Benachrichtigung ueber Ausfallende Kurse" << endl; cout << "Auswahl: "; cin >> auswahl; switch(auswahl){ case 1: mp1(); break; case 2: mp2(); break; case 3: mp3(); break; } } while(auswahl !=3); system("pause"); }Hier mein kompletter Code, hoffe das ganze ist jetzt nicht zu umfangreich..
Fehler bekomme ich in
Zeile 59[Error] 'student' does not name a typeZeile 84
[Error] 'student' is not a typeZeilen 147,150,153, 171, 174, 177
[Error] no matching function for call to 'kurs::student_aufnehmen()'
-
Vielleicht solltest du das stottern lassen
student student[30];
-
Dein Fehler ist hier:
student student[30]; //Feld zur Speicherung aller Studentendaten (max 30, da 3 Kurse mit max. 10 Studenten)Wenn du dein Array genauso nennst wie die Klasse dann bezeichnet student danach dein Array und nicht mehr deine Klasse. Du müsstest dir also einen anderen Namen für das Array ausdenken wenn das Array nicht sowieso total unnötig wäre. Deine Kurs Klasse speichert doch bereits Kopien von den Studenten also kannst du einfach ein neues lokales Objekt anlegen und das dann an
student_aufnehmen()übergeben.Noch ein paar Anmerkungen:
-Warum schreibst du überall die Klasse dazu? Also z.B. beik1.kurs::student_aufnehmen();, es reicht völlig wenn mank1.student_aufnehmen();schreibt. Das Angeben der Klasse ist nur bei Vererbung sinnvoll und auch nur dann wenn man explizit eine bestimmte Klasse aufrufen will.
-Warum nutzt du nicht den Konstruktor in der student Klasse statt deinernew_studentFunktion?
-
Die IDE von bloodshed ist aus 2005 oder?
Also wenns nicht die überarbeite Version ist, dann schmeiß deine IDE weg und hol dir Visual Studio (angenommen windows).
Eigentlich solltest du dir oder so VS holen.