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 type
    

    Kann 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 student und kurs Klasse 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 die student Klasse 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 type
    

    Zeile 84

    [Error] 'student' is not a type
    

    Zeilen 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. bei k1.kurs::student_aufnehmen(); , es reicht völlig wenn man k1.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 deiner new_student Funktion?



  • 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.


Anmelden zum Antworten