In einer Methode einer Klasse die Methode einer anderen Klasse aufrufen ?



  • ich vermute ich habe viel bockmist getrieben. mit meinem buch komme ich auch nicht ganz weiter....

    was ist denn ein Member ?

    ich zeige mal einen ausschnitt wie ich z.b. mich in einen kurs/PV einschreiben möchte:

    void Hochschule::einschreiben_kurs() {
    
    Fachbereich *objekt;     // da ich nicht von Hochschule direkt in Studiengang springen möchte, sondern dies über die klasse Fachbereich machen möchte, erzeuge ich ein objekt der klasse Fachbereich.
    
    	if (objekt->get_status() == 1) {   // statusabfrage ob bereits in studiengang 1 ODER 2 eingeschrieben, falls nicht, kann ich mich auch in keinen kurs einschreiben
    
    		objekt->set_kurs();   //diese methode erstellt wieder ein objekt der klasse studiengang, welche den student einschreibt                                                                                               
    	}
    
    	else if (objekt->get_status() == 2) {  // mit else if gearbeitet, weil ja(siehe oben) bool nicht funktioniert hat
    		objekt->set_kurs();
    	}
    
    	else {
    		cout << "Bitte zuerst in einen Studiengang wählen !!" << endl << endl;                               // ansonsten erst in studiengang einschreiben
    	}
    }
    

    aufjedenfall bekomme ich in Zeile 5 schon die eben genannte Fehlermeldung, wegen : (objekt->get_status() == 2)



  • Smuji schrieb:

    Fachbereich *objekt;     /* da ich nicht von Hochschule direkt in Studiengang springen möchte, 
    sondern dies über die klasse Fachbereich machen möchte, erzeuge ich ein objekt der klasse Fachbereich.*/
    

    Nee, das tust Du hier eben nicht!
    Du definierst hier nur einen Zeiger, der auf ein Objekt der Klasse Fachbereich zeigen könnte, er tut es aber nicht!



  • hmm....

    und wie würde es richtig aussehen ?!?



  • Na, zB.:

    Fachbereich objekt;
    
    ...
    
    //Zugriff:
    objekt.get_status() ... //anstelle von objekt->get_status()
    


  • Wobei Bellis Antwort nur den Kompilerfehler entfernt.
    Unsinnig bleibt das trotzdem.

    Fachbereich objekt;
    
    if (objekt.get_status() == 1) {
    

    Wer soll denn da auf wundersame weise den Status zwischen Zeile 1 und 3 geändert haben?



  • Genau. Ich hatte in meinem letzten Post noch die Frage gestellt:

    welcher Fachbereich soll das sein, es wurde keiner zugewiesen!

    Diese Frage ist von dir bislang unbeantwortet. Was soll Fachbereich objekt denn sein? Ein generischer Fachbereich? Ein spezieller Fachbereich wie "Naturwissenschaften"?

    Was soll objekt.get_status() denn zurückliefern?! Das bleibt alles völlig unklar. Wieso erzeugst du dort überhaupt einen Fachbereich? Du müsstest dir doch eigentlich irgendwie die Fachbereich-Liste von der Hochschule holen können.



  • hey, erst nochmal vielen Dank für euren Einsatz.

    Ich habe meinen Fehler gefunden.

    Ich habe die ganze Zeit mit * und -> gearbeitet, weil mir auf die herkömmliche Art und Weise das Objekt immer rot unterstrichen wurde.
    Ich konnte mir zwar nicht erklären, warum ich mit * und -> arbeite, aber das war die einzige Möglichkeit keinen roten Unterstrich zu bekommen.

    Nun war ich mal 'ne viertel Stunde an der Luft und tadaa, Fehler gefunden...für Fachbereich gibt es keinen Standardkontruktor.

    Warum ?!? Weil ich ihn iwann gelöscht habe. Vermutlich weil ich ihn nicht benutzt habe. Also habe ich den Standardkonstruktor wiederhergestellt und siehe da, es klappt.

    Ich dachte, wenn ich einen anderen Konstruktor habe, bräuchte ich den Standardkonstruktor nicht mehr und kann ihn löschen, um es übersichtlicher zu machen. Falsch gedacht.

    Nun ja, ich mach dann mal weiter. Ich bin mir sicher, ihr werden nochmal von mir hören 😉



  • Smuji schrieb:

    Ich dachte, wenn ich einen anderen Konstruktor habe, bräuchte ich den Standardkonstruktor nicht mehr und kann ihn löschen, um es übersichtlicher zu machen. Falsch gedacht.

    Logischerweise kannst du nicht das löschen, was gebraucht wird.



  • Smuji schrieb:

    Ich habe meinen Fehler gefunden.

    Du hast nur ein technisches Problem behoben. Die Frage bleibt immer noch, was der Code den eigentlich tun soll. Was soll das get_status bei einem default-konstuierten Fachbereich liefern? Und warum sollte es mal 1, mal 2 und mal noch was anderes ergeben?

    Es bringt nichts, so lange den Code zu ändern, bis er kompiliert, solange du dir nicht endlich Gedanken machst, wie das alles zusammenhängen soll.



  • also der code kompiliert schon. nur er funktioniert noch laaaaaange nicht 🙂

    jetzt beginnt für mich erst das fehler ausmerzen bzw. das "in gang bringen".
    nun kommt schon das erste problem.

    ich habe in der klasse etwas wie:

    class Fachbereich
    {
    	string bezeichnung;
    	int studiengang = 0;
            ...
    

    nun setzt mir meine einschreibmethode - > int studiengang = 1;

    sobald die methode durchlaufen wurde und ich zurück in main() ankomme und mir dort zum test studiengang nochmal ausgebe, hat es wieder den wert = 0;

    bleibt das nicht dauerhaft geändert ?



  • Ohne minimales, kompilierbares Codebeispiel schwer zu sagen, was du programmiert hast. 😉



  • ok, ich will euch eigentlich keine alpträume machen mit meinem code, aber ich poste mal alles was ich bisher so geschrieben habe.

    p.s. beachtet nicht so die kommentare, die sind zum teil noch von vor tagen und falsch, diese wollte ich wenn ich fertig bin noch verändern.

    auch muss ich überprüfen ob nicht ein paar methoden überflüssig sind....

    MAIN

    #include "Header.h"
    #include "main.h"
    
    /*Erstelle folgende Klassen: 
    
    Hochschule (Container für deine Fachbereiche, Methoden zum Hinzufügen und Entfernen von Fachbereichen) 
    Fachbereich (Container für Studiengänge, Methoden zum Hinzufügen und Entfernen von Studiengängen) 
    Studiengang (der spezifische Studiengang, Methoden zum Einschreiben ...) 
    Student
    
    \201 => ü
    \204 => ä
    \224 => ö
    
    */
    
    int main() {
    
    	int auswahl = 0;
    	int zähler = 0;
    	Hochschule *objekt;
    	Fachbereich hans; //test
    
    	objekt = new Hochschule ("Technische Hochschule Mittelhessen");           // neue Hochschule erbaut
    
    	Hochschule *thm[10];                                                                        // konstruktor NULL übergeben an beide werte und nur einer
    
    	do {
    		cout << objekt->get_name() << " - Studentenverwaltung:" << endl << endl;
    		cout << "MENUE:" << endl << endl;
    		cout << "\t 1 = In einen Studiengang einschreiben" << endl << endl;
    		cout << "\t 2 = In einen Kurs einschreiben" << endl << endl;
    		cout << "\t 3 = Noten des Kurses eintragen" << endl << endl;
    		cout << "\t 4 = Ausgabe aller Studierenden" << endl << endl << endl;
    		cout << "\t 5 = Nächster Student" << endl << endl << endl;
    		cout << "Treffen Sie bitte jetzt Ihre Auswahl: " << endl << endl << endl;
    		cin >> auswahl;
    		cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    
    		switch (auswahl) {
    
    		case 1:
    			thm[zähler]->einschreiben_sg();                       // öffne hochschule, methode einschreiben_sg
    			break;
    
    		case 2:
    			thm[zähler]->einschreiben_kurs();
    			break;
    
    		case 3:
    			thm[zähler]->eintragen_note();
    			break;
    
    		case 4:
    			for (int i = 0; i <= zähler; i++) {
    				thm[i]->ausgabe();
    			}
    
    			break;
    
    		case 5:
    			zähler++;  // status auf 0 setzen, kurse auf 0 setzen , anzahl fächer wieder 0  zähler, kurs 1-3 auf 0 setzen
    			break;
    		}
    
    	} while ((auswahl > 0) && (auswahl < 6));
    	// cin.fail fehlerhafte eingabe
    
    	cout << "Fehlerhafte Eingabe" << endl << endl;
    	cout << "Programm beendet !!!" << endl << endl;
    	system("pause");
    	return 0;
    }
    

    HEADER:

    #pragma once
    
    #include <iostream>
    #include <string>
    #include <ctime>  // zeitverz. brauch ich nicht ?
    #include <windows.h> // für zeiterzögerung
    
    using namespace std;
    
    class Hochschule
    { 
    	string thm;
    
    public:
    	Hochschule(string);   // konstriktur
    	string get_name();     // bruache ich das ??????????
    
    	void einschreiben_sg();
    	void einschreiben_kurs();	
    	void eintragen_note();
    	void ausgabe();
    };
    
    //--------------------------------------------------------------
    
    class Fachbereich
    {
    	string bezeichnung;
    	string aeb;  // 1
    	string ti;   // 2
    	int studiengang = 0;        // status ob bereits eingeschrieben oder nicht 0 nein, 1 aeb , 2 ti FÜR AUSGABE
    
    public:
    	Fachbereich();
    	Fachbereich(string, string, string);  //konstruktor
    
    	string get_bezeichnung();     // ausgabe WIllkommen in hochschule cpp
    	int get_status();        // brauch ich für xterne abfrage, bevor man in kurs einschreibt, siehe hochschule, einschreiben_kurs
    
    	void set_sg();    // student in     aeb oder ti einschreiben studiengang
    
    	void set_aeb();  // methode zum einschreiben und namen speichern
    	void set_ti();     // methode zum einschreiben und namen speichern
    
    	void set_kurs();  // weiterleitung zu studiengang, da dort die kurse hinterlegt sind
    
    	string get_sg();  // rückgabe stduiengang
    
    };
    
    //-----------------------------------------------------------------
    
    class Studiengang
    {
    	string bezeichnung;
    	int zähler = 0;                   //  man darf max. 2 kurse belegen zähler
    
    	string mathe1;                   // namen
    	string swt1;                      // namen
    	string swt2;                       // namen
    
    	int kurs1 = 0;    // status ob eingeschrieben
    	int kurs2 = 0;
    	int kurs3 = 0;
    
    	//NOTEN
    
    	int note_mathe1 = 0;        // note hinterlegt
    	int note_swt1 = 0;
    	int note_swt2 = 0;
    
    public:
    	Studiengang();
    	Studiengang(string, string, string);
    	void set_bezeichnung(string);
    	string get_bezeichnung();
    
    	void set_mathe1();  // status setzen, eintragen
    	void set_swt1();
    	void set_swt2();
    
    	void set_note();  // note eintragen
    
    	string get_kurs_note();
    
    };
    
    //----------------------------------------------------------------
    
    class Student
    {
    	string name;
    	int status = 0;  // wenn noch keine student ... wenn student dann 1
    
    	                    //NEW STUDENT BEI EINCHRIEBEN
    public:
    	Student();
    	Student(string);
    
    	void set_status();
    	int get_status();
    
    	void set_name();
    	string get_name();
    };
    

    CPP

    #include "Header.h"
    
    Hochschule::Hochschule(string x)                                                                // Konstr. wird in main() aufgerufen und THM erhält Namen
    {
    	thm = x;
    }
    
    string Hochschule::get_name() {                                                                                          // in main() Ausgabe Überschrift
    	return thm;
    }
    
    void Hochschule::einschreiben_sg() {                                    // erstellt neuen FB, übergibt Konstr. FB,AEB,TI und öffnet das Einschreiben in SG
    
    	Fachbereich *objekt;
    	objekt = new Fachbereich("Informationstechnik - Elektrotechnik - Mechatronik", "Allgemeine Elektrotechnik Bachelor", "Technische Informatik");    
    
    	cout << "Willkommen in: \t\t" << objekt->get_bezeichnung() << endl << endl << endl << endl;                         // holt FB-Bezeichnung und Ausgabe 
    
    	objekt->set_sg();                                                                                           // öffnet das Einschreiben in Studiengang
    }
    
    void Hochschule::einschreiben_kurs() {
    
    	Fachbereich objekt;     
    
    	if (objekt.get_status() == 1) {                     // statusabfrage ob bereits in studiengang 1 ODER 2 eingeschrieben
    		objekt.set_kurs();                                                                                                     // dann öffne einschreiben
    	}
    
    	else if (objekt.get_status() == 2) {
    		objekt.set_kurs();
    	}
    
    	else {
    		cout << "Bitte zuerst in einen Studiengang w\204hlen !!" << endl << endl;                               // ansonsten erst in studiengang einschreiben
    	}
    }
    
    void Hochschule::eintragen_note() {    // naja, besser malal
    
    	Studiengang objekt;
    
    	objekt.set_note();
    
    }
    
    void Hochschule::ausgabe() {
    
    	Fachbereich objekt1, objekt2;
    	Student objekt3;
    	Studiengang objekt4;
    
    	cout << "\201bersicht aller Studenten, Studiengänge, Kurse und Noten;" << endl << endl << endl << endl;
    	cout << "Fachbereich: " << objekt1.get_bezeichnung() << endl << endl;
    	cout << "Student: " << objekt3.get_name() <<  endl << endl;
    	cout << "Studiengang: " << objekt2.get_sg() << endl << endl;
    	cout << "Kurse und Noten: " << objekt4.get_kurs_note() << endl << endl;
    
    }
    
    //--------------------------------------------------------------------------------------------
    Fachbereich::Fachbereich(){ 
    }
    
    Fachbereich::Fachbereich(string x, string y, string z)  // konstruktor darf nicht 0 setzen, sonst bei jedem objekt erzeugen wieder = 0
    {
    	bezeichnung = x;
    	aeb = y;
    	ti = z;
    }
    
    string Fachbereich::get_bezeichnung() {                                                                             // für die Ausgabe "Willkomen in IEM"
    	return bezeichnung;
    }
    
    int Fachbereich::get_status() {                                                    // für abfrage VOR kurs einschreiben, ob überhaupt schon in studiengang
    	return studiengang;
    }
    
    void Fachbereich::set_kurs() {    // auswahl studiengang
    
    	int auswahl;
    	Studiengang objekt;
    
    	if (studiengang == 1) {                                                                                             // wenn in AEB, dann swt1 mathe 1
    		cout << "Sie befinden sich im Studiengang Allgemeine Elektrotechnik" << endl << endl;
    		cout << "Sie k\224nnen sich nun in folgende Kurse w\204hlen: " << endl << endl;
    		cout << "\t\t\t\t 1 = Mathe 1" << endl << endl;
    		cout << "\t\t\t\t 2 = SWT 1" << endl << endl;
    		cout << "Bitte w\204hlen Sie eine Nummer aus:" << endl << endl;
    		cin >> auswahl;
    
    		switch (auswahl) {
    
    		case 1:
    			objekt.set_mathe1();
    			break;
    
    		case 2:
    			objekt.set_swt1();
    			break;
    		}
    		cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    	}
    
    	else if (studiengang == 2) {                                                                                // wenn in TI, dann swt1, swt2 und mathe 1
    		cout << "Sie m\224chten sich in einen Kurs einschreiben." << endl << endl;
    		cout << "Bitte w\204hlen Sie eine Nummer aus:" << endl << endl;
    		cout << "\t\t\t\t 1 = Mathe 1" << endl << endl;
    		cout << "\t\t\t\t 2 = SWT 1" << endl << endl;
    		cout << "\t\t\t\t 3 = SWT 2" << endl << endl;
    		cin >> auswahl;
    
    		switch (auswahl) {
    
    		case 1:
    			objekt.set_mathe1();
    			break;
    
    		case 2:
    			objekt.set_swt1();
    			break;
    
    		case 3:
    			objekt.set_swt2();
    			break;
    		}
    		cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    	}
    
    	else {
    		cout << " IRGENDWAS STIMMT MIT DER EINSCHREIBUNG IM STUDIENGANG NICHT, versuchen erneneutuueuuuuufufufufuf" << endl;
    		system("pause");
    	}
    }
    
    void Fachbereich::set_sg() {                                                                                               // in Studiengang einschreiben
    
    	int auswahl = 0;
    
    	if (studiengang == 0) {                                      // wenn studiengang = 0, ist noch kein studiengang gewählt und man kann sich einschreiben
    		cout << "Sie m\224chten sich in einen Studiengang einschreiben." << endl << endl;
    		cout << "Bitte w\204hlen Sie eine Nummer aus:" << endl << endl;
    		cout << "\t\t\t\t 1 = AEB" << endl << endl;
    		cout << "\t\t\t\t 2 = TI" << endl << endl;
    		cin >> auswahl;
    		cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    
    		switch (auswahl) {
    		case 1:
    			set_aeb();                                                                                                  // öffnet das dortige Einschreiben
    			cout << " Sie haben sich erfolgreich in " << aeb << " eingeschrieben." << endl << endl;
    			cout << studiengang;
    			break;
    
    		case 2:
    			set_ti();                                                                                                   // öffnet das dortige Einschreiben
    			cout << " Sie haben sich erfolgreich in " << ti << " eingeschrieben." << endl << endl;
    			break;
    		}
    
    		// ausgabe EINGESCHRIEBEN !!!! mit verzögerung  ausgabe
    	}
    
    	else {
    		cout << "Sie sind bereits in einen Studiengang eingeschrieben !!!" << endl << endl;      // falls studiengang = 1 oder 2, ist schon eingeschrieben
    	}
    }
    
    void Fachbereich::set_aeb() {     // einschreiben in aeb öffnen konstruktor student und übergeben name udn setzen status 1 in stud und 1 in fachbere
    
    	Student *neu;
    	string eingabe;
    
    	cout << "Sie m\224chten sich einschreiben in " << aeb << endl << endl;
    	cout << "Geben Sie bitte Ihren Vor- und Nachnamen ein: " << endl << endl;
    	cin >> eingabe;
    	neu = new Student(eingabe);   // wenn status = 0 -> kein student,   1 -> student name schon gesetzt
    	cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    	studiengang = 1;                         // aeb ist 1
    	neu->set_status();
    }
    
    void Fachbereich::set_ti() {
    
    	Student *neu;
    	string eingabe;
    
    	cout << "Sie m\224chten sich einschreiben in " << ti << endl << endl;
    	cout << "Geben Sie bitte Ihren Vor- und Nachnamen ein: " << endl << endl;
    	cin >> eingabe;
    	neu = new Student(eingabe);
    	cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    	studiengang = 2;
    	neu->set_status();
    
    }
    
    string Fachbereich::get_sg() {  
    
    	if (studiengang == 1) {
    		return aeb;
    	}
    
    	else if (studiengang == 2) {
    		return ti;
    	}
    
    	else {
    		return "leer";                              // darf eigentlich nie vorkommen
    	}
    }
    
    //--------------------------------------------------------------------------
    
    Studiengang::Studiengang() {
    
    }
    
    Studiengang::Studiengang(string x, string y, string z)                     //Konstruktor mit übergabe status
    {
    	mathe1 = x;
    	swt1 = y;
    	swt2 = z;
    }
    
    string Studiengang::get_bezeichnung() {
    	return bezeichnung;
    }
    
    void Studiengang::set_bezeichnung(string y) {
    
    	bezeichnung = y;
    
    	return;
    }
    
    void Studiengang::set_mathe1() {  // ich muss namen nicht überprüfen, da es vorher schon gemacht wird
    
    	Student objekt;
    
    	if (zähler < 2) {
    		cout << "Willkommen " << objekt.get_name() << "in " << mathe1 << endl << endl;
    
    		cout << "Sie werden nun eingeschrieben" << endl << endl;
    
    		// zeitverzögerung
    		kurs1 = 1;
    		cout << "Sie belegen nun den Kurs " << mathe1 << "Viel Erfolg !" << endl << endl;
    
    		zähler++;
    	}
    
    	else {
    		cout << "Sie d\201rfen sich leider nur in 2 Kurse einschreiben" << endl << endl;
    		system("pause");
    	}
    }
    
    void Studiengang::set_swt1() {
    
    	Student objekt;
    
    	if (zähler < 2) {
    		cout << "Willkommen " << objekt.get_name() << "in" << swt1 << endl << endl;
    
    		cout << "Sie werden nun eingeschrieben" << endl << endl;
    
    		// zeitverzögerung
    		kurs2 = 1;
    		cout << "Sie belegen nun den Kurs" << swt1 << "Viel Erfolg !" << endl << endl;
    
    		zähler++;
    	}
    
    	else {
    		cout << "Sie d\201rfen sich leider nur in 2 Kurse einschreiben" << endl << endl;
    		system("pause");
    	}
    }
    
    void Studiengang::set_swt2() {
    
    	Student objekt;
    
    	if (zähler < 2) {
    		cout << "Willkommen " << objekt.get_name() << "in " << swt2 << endl << endl;
    
    		cout << "Sie werden nun eingeschrieben" << endl << endl;
    
    		// zeitverzögerung
    
    		kurs3 = 1;
    		cout << "Sie belegen nun den Kurs " << swt2 << "Viel Erfolg !" << endl << endl;
    
    		zähler++;  // damit man max. 2 kurse belegen kann
    	}
    
    	else {
    		cout << "Sie d\201rfen sich leider nur in 2 Kurse einschreiben" << endl << endl;
    		system("pause");
    	}
    }
    
    void Studiengang::set_note() {
    
    	int note;
    	int auswahl;
    	int rückgabewert;
    
    	Fachbereich objekt;
    	rückgabewert = objekt.get_status();
    
    	if (rückgabewert == 1) {                                         // wenn  AEB eingetragen 
    		cout << "Sie m\224chten eine Note eintragen." << endl << endl;
    		cout << "Bitte w\204hlen Sie den Kurs: " << endl << endl;
    		cout << "\t\t\t\t 1 = Mathe 1" << endl << endl;
    		cout << "\t\t\t\t 2 = Swt 1" << endl << endl;
    		cin >> auswahl;
    
    		switch (auswahl) {
    			case 1:
    				if(kurs1 == 1){                                   //wenn kurs1_status, dann mathe1 eintragen
    					cout << "Welche Note soll eingetragen werden ?" << endl << endl;
    					cin >> note;
    					note_mathe1 = note;
    				}
    
    				else {
    					cout << "Kurs wurde nicht belegt" << endl << endl;
    					}
    
    				break;
    
    			case 2:
    				if (kurs2 == 1) {                              //wenn kurs2_status, dann swt11 eintragen
    					cout << "Welche Note soll eingetragen werden ?" << endl << endl;
    					cin >> note;
    					note_swt1 = note;
    				}
    
    				else {
    				cout << "Kurs wurde nicht belegt" << endl << endl;
    				}
    
    				break;
    		}
    
    	}
    
    	else if (rückgabewert == 2) {                                 //TI eingeschrieben ??
    		cout << "Sie m\224chten eine Note eintragen." << endl << endl;
    		cout << "Bitte w\204hlen Sie den Kurs: " << endl << endl;
    		cout << "\t\t\t\t 1 = Mathe 1" << endl << endl;
    		cout << "\t\t\t\t 2 = Swt 1" << endl << endl;
    		cout << "\t\t\t\t 3 = Swt 2" << endl << endl;
    		cin >> auswahl;
    
    		switch (auswahl) {
    			case 1:
    				if (kurs1 == 1) {                          //wenn kurs1_status, dann mathe1 eintragen
    					cout << "Welche Note soll eingetragen werden ?" << endl << endl;
    					cin >> note;
    					note_mathe1 = note;
    				}
    
    				else {
    					cout << "Kurs wurde nicht belegt" << endl << endl;
    				}
    
    			break;
    
    		case 2:
    			if (kurs2 == 1) {    //wenn kurs2_status, dann swt1 eintragen
    				cout << "Welche Note soll eingetragen werden ?" << endl << endl;
    				cin >> note;
    				note_swt1 = note;
    			}
    
    			else {
    				cout << "Kurs wurde nicht belegt" << endl << endl;
    			}
    
    			break;
    
    		case 3:
    			if (kurs3 == 1) {    //wenn kurs3_status, dann swt2 eintragen
    				cout << "Welche Note soll eingetragen werden ?" << endl << endl;
    				cin >> note;
    				note_swt2 = note;
    			}
    
    			else {
    				cout << "Kurs wurde nicht belegt" << endl << endl;
    			}
    
    			break;
    		}
    	}
    
    	else {
    		cout << "Sie sind weder in einem Studiengang, noch in einem Kurs eingeschrieben" << endl << endl;
    	}
    }
    
    string Studiengang::get_kurs_note() {
    	if (kurs1 == 1) {                   // Mathe 1 mit Note
    		cout << mathe1;
    			if (note_mathe1 != 0) {
    				cout << note_mathe1;
    			}
    			else {
    				cout << "keine Note";
    			}
    	}
    
    	if (kurs2 == 1) {                   // Swt1  mit Note
    		cout << swt1;
    		if (note_swt1 != 0) {
    			cout << note_swt1;
    		}
    		else {
    			cout << "keine Note";
    		}
    	}
    
    	if (kurs3 == 1) {                   // Swt2 mit Note
    		cout << swt2;
    		if (note_swt2 != 0) {
    			cout << note_swt2;
    		}
    		else {
    			cout << "keine Note";
    		}
    	}
    
    	else {
    		return "keine Kurse und keine Noten";
    	}
    }
    
    //--------------------------------------------------------------------------
    Student::Student() {
    
    }
    
    Student::Student(string x) {
    	name = x;
    }
    
    string Student::get_name() {     // bei der Ausgabe benötigt
    	if (status == 1) {
    		return name;
    	}
    
    	else {
    		return "leer";
    	}
    }
    
    void Student::set_name() {
    	return;
    }
    
    void Student::set_status() {   // status auf eins, damit andere wissen, name steht schon
    	status = 1;
    }
    
    int Student::get_status() {
    	return status;
    }
    


  • Naja, du erzeugst in fast allen Funktionen neue Objekte irgendeiner Klasse. Diese Objekte werden nach den Funktionen jeweils zerstört. Wenn du die nicht zu Beispiel in Member Variablen speicherst, kannst du auf die nicht aus anderen Funktionen drauf zugreifen.

    Ausführlicheres Feedback kann ich grade nicht geben, da ich nur am Smartphone sitze und das lesen und schreiben so etwas mühselig ist.



  • Das einzig sinnvolle scheint mir der Kommentar ganz am Anfang deines Programms zu sein:

    /*Erstelle folgende Klassen: 
      
    Hochschule (Container für deine Fachbereiche, Methoden zum Hinzufügen und Entfernen von Fachbereichen) 
    Fachbereich (Container für Studiengänge, Methoden zum Hinzufügen und Entfernen von Studiengängen) 
    Studiengang (der spezifische Studiengang, Methoden zum Einschreiben ...) 
    Student 
    */
    

    Der Kommentar (vermutlich die Aufgabe?) liest sich sinnvoll: eine Hochschule hat Fachbereiche. Fachbereiche haben Studiengänge. In Studiengänge können sich Studenten einschreiben.

    Du hast etwas anderes gebaut: du erzeugst erst eine Hochschule (Variable objekt , übrigens ein äußerst schlechter Name. Objekt kann alles sein. Vergib vernünftige Namen. Wenn es keine bestimmte Hochschule sein soll, ist ggf. der Name der Klasse in Kleinbuchstaben sinnvoll, also Hochschule hochschule; )

    Danach kommt dein thm-Array von 10 uninitialisierten Hochschulpointern. Was soll das? Ich schrieb schon: verwende std::vector für sowas! Mir ist auch nicht klar, warum jeder Student auf eine eigene (andere) Hochschule gehen sollte. Warum kann man in die Hochschule eine Note eintragen? Das ergibt doch so keinen Sinn!

    Konkret meine ich das hier:

    Hochschule *objekt;
        objekt = new Hochschule ("Technische Hochschule Mittelhessen");           // neue Hochschule erbaut
     
        Hochschule *thm[10];                                                                        // konstruktor NULL übergeben an beide werte und nur einer
    

    D.h. du erzeugst die "Technische Hochschule Mittelhessen" im Freispeicher und speicherst einen Pointer auf diese Hochschule in "objekt". So weit, so gut. Aber warum willst du dann 10 Zeiger auf Hochschule haben und warum nennst du dieses Array "thm"? Die THM ist doch bereits in "objekt" referenziert! Außerdem wird hier kein Konstruktor gerufen. Der Kommentar ergibt also keinen Sinn.

    Dann der Fachbereich: soll das nun ein Fachbereich sein oder 3 Fachbereiche? Lass es beim Einfachsten: die Klasse Fachbereich soll nur einen (nicht mehrere) FB modellieren!

    Ebenso dein Studiengang. Die Klasse sollte genau einen SG modellieren, nicht mathe, swt und sonstwas!

    Der Status in der Klasse Student scheint mir auch nicht sinnvoll zu sein.

    Generelle Tipps:
    []Pack die Eingabe von Tastatur nicht in die Methoden deiner Klassen. Eine Hochschule modelliert eine Hochschule, nicht das Einlesen von zu Hochschule zugehörigen Daten. Das erleichtert dir auch später das Testen deines Codes.
    [
    ]Deine Kommentare wie "öffne hochschule" sind merkwürdig. Da wird doch gar nichts geöffnet!
    [*]Vermeide Umlaute in Namen von Variablen!

    Zur Lösung der Aufgabe, scheint mir, reicht es nicht aus, hier im Forum irgendwas zu lesen. Du solltest vorlesungsbegleitendes Material lesen, dir ggf. ein gutes Buch besorgen (wie z.B. "Der C++-Programmierer" von Breymann oder "C++ Primer" von Lippman) und mit deinen Kommilitionen sprechen. Es scheint hier so viel grundlegendes zu fehlen, dass wir hier nicht mal schnell helfen können.



  • habe nun den c++ programmierer, bin schon am durcharbeiten und habe das alte projekt schon gelöscht..... verstehe schon einige fehler, welche ich gemacht hatte....

    danke



  • also, ich bin zurück. ich habe mir auch mal eine lösung von einem kumpel angeschaut, bei dem es funktioniert.

    ich habe nun erstmal versucht nur das einschreiben zu realisieren und habe es ähnlich gemacht wie er (er hat VS2012, ich nutze 2017)

    bei ihm klappt es, bei mir sind 85 fehler ?!?
    ich versuche nun die fehler zu elimineren, kann sie aber nicht deuten.

    Beispiel, bezogen auf:

    class Hochschule
    {
    	int studenten_zaehler;              // zählt die aktuell eingeschriebenen Studenten
    	Student *liste[10];                // 10 Studenten können in die THM
    	Fachbereich fachbereich;            // einen Fachbereich in die Hochschule integrieren (ein Objekt der Klasse Fachbereich)
    
    public:
    	Hochschule();
    
    	void add_student(string);
    };
    

    Erhalte ich die Fehler:

    - Fehler C2143 Syntaxfehler: Es fehlt ";" vor "*" 16
    - Fehler C4430 Fehlender Typspezifizierer - int wird angenommen.
    - Fehler C2238 Unerwartete(s) Token vor ";" 16 letzteAufgabe

    Mich wundert, dass es bei ihm funktioniert, obwohl er es ähnlich hat.
    Weiß jemand Rat ?

    **
    Header**

    #pragma once
    
    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <limits>
    
    using namespace std;
    
    enum { TI = 0, AE };  // TI =0  AE =1  dadurch muss ich kein element 0 oder 1 verwenden, sondern sehe direkt 
    
    class Hochschule
    {
    	int studenten_zaehler;              // zählt die aktuell eingeschriebenen Studenten
    	Student *liste[10];                // 10 Studenten können in die THM
    	Fachbereich fachbereich;            // einen Fachbereich in die Hochschule integrieren (ein Objekt der Klasse Fachbereich)
    
    public:
    	Hochschule();
    
    	void add_student(string);
    };
    
    //---------------------------------------------------------------------------------------------------------
    
    class Fachbereich
    {
    	string fb_name;
    
    public:
    	Fachbereich();
    
    	string get_fb_name();
    	Studiengang *studiengang[2];
    };
    
    //----------------------------------------------------------------------------------------------------------
    
    class Studiengang
    {
    
    	string sg_name;                 // aeb oder TI
    	string pv_name[2];        // 2 PVs pro Studiengang möglich              
    	int anzahl_studenten;             // hier wird die anzahl gespeichert
    
    public:
    	Studiengang(string);
    	int get_anzahl();                   // gibt die anzahl_stuenten zurück
    	string get_sg_name();
    	string get_pv_name(int);
    	void student_hinzugefügt();
    };
    
    //---------------------------------------------------------------------------------------------------
    
    class Student
    {
    	string name;
    	string fachbereich;
    	string studiengang;
    	string kurs[2];
    	int note[2];
    
    public:
    	Student(string);
    	void set_fachbereich(string);
    	void set_studiengang(string);
    	void set_pv(string, string);
    	void set_pv_note(string, int);
    
    	string get_name();
    	string get_fb();
    	string get_sg();
    	string get_pv(int);
    	int get_pv_noten(string);
    };
    

    CPP

    #include "Header.h"
    
    Hochschule::Hochschule() : studenten_zaehler{ 0 } {                       // Konstruktor setzt studenten_anzahl zähler auf 0
    	for (int i = 0; i < 10; i++) {
    		liste[i] = NULL;                                      // alle Elemente = NULL setzen, da  ? sonst zufällige/unbekannte Werte vorhanden ?
    	}
    	cout << "Willkommen in der Technischen Hochschule Mittelhessen" << endl << endl;    // Ausgabe WILLKOMMEN
    }
    
    void Hochschule::add_student(string name) {
    	string eingabe;
    	int note;
    
    	if (studenten_zaehler == 10) {      // wenn der zähler bei 10 steht, können keine studenten mehr rein
    		cout << "Alle Studienplätze sind schon belegt";
    		return;                                                              // rausspringen aus der methode
    	}
    
    	cout << "Bitte wählen Sie einen der folgenden Studiengänge." << endl << endl;
    	cout << "AE = Allgemeine Elektrotechnik" << endl << endl;
    	cout << "TI = Technische Informatik" << endl << endl;
    	cout << "Bitte geben Sie die Kurzbezeichnung des gewünschten Studiengangs ein: " << endl << endl;
    	cin >> eingabe;
    
    			if (cin.fail()) {                                                        // bei fehlerhafter Eingabe
    				cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    				cout << "Fehlerhafte Eingabe" << endl << endl;
    			}
    
    	if (eingabe == "TI") {                                                    // wenn TI ausgewählt wurde
    
    			if (fachbereich.studiengang[TI]->get_anzahl() == 5) {                    // 0 = ti wenn getanzahl an ti die 5 gibt dann sind 5 ti,ler drinnen
    				cout << "Kein weiterer Student möglich" << endl << endl;
    				return;                                               // raus aus der methode
    			}
    
    		liste[studenten_zaehler] = new Student(name);  // bsp. studenten_zähler[0] = new student(eingegeber name) übergeben. konstr. student schreibt namen
    		liste[studenten_zaehler]->set_fachbereich(fachbereich.get_fb_name()); // liste[0] öffnet set_fachbereich und übergibt den geholten IEM namen
    		liste[studenten_zaehler]->set_studiengang(fachbereich.studiengang[TI]->get_sg_name()); //über fachbereich in HS, objekt von FB, greife ich auf objekt Studiengang zu und öffne die methode 
    
    		liste[studenten_zaehler]->set_pv(fachbereich.studiengang[TI]->get_pv_name(0), fachbereich.studiengang[TI]->get_pv_name(1));
    		// öffne set_pv (name) und übergebe per indirektem zugriff über rückggabewert den namen , je nachdem ob 0 oder 1 als attribut übergeben
    
    		cout << " Tragen Sie bitte Ihre Noten für die jeweilige Veranstaltung ein." << endl << endl;
    		cout << fachbereich.studiengang[TI]->get_pv_name(0) << ": ";  // 
    
    		do {
    			cin >> note;
    			cout << endl << endl;
    
    				if ((cin.fail()) || (note < 1) || (note > 5)) {
    				cerr << "Fehlerhafte Eingabe. Bitte versuchen Sie es noch einmal." << endl << endl;
    				cin.clear();
    				cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    				note = 0;
    				}
    			} while ((note < 0) || (note > 5));
    
    			liste[studenten_zaehler]->set_pv_note(liste[studenten_zaehler]->get_pv(0), note);    // übergebe kurs 0 = name und note 0 = note
    
    			cout << fachbereich.studiengang[TI]->get_pv_name(1) << ": ";  // 
    
    		do {
    				cin >> note;
    				cout << endl << endl;
    
    				if ((cin.fail()) || (note < 1) || (note > 5)) {
    					cerr << "Fehlerhafte Eingabe. Bitte versuchen Sie es noch einmal." << endl << endl;
    					cin.clear();
    					cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    					note = 0;
    				}
    			} while ((note < 0) || (note > 5));
    
    			liste[studenten_zaehler]->set_pv_note(liste[studenten_zaehler]->get_pv(1), note);    // übergebe kurs 0 = name und note 0 = note
    
    			fachbereich.studiengang[TI]->student_hinzugefügt();     // anzahl_studenten in studiengang erhöht
    			studenten_zaehler++;   // auch in hochschule ein weiterer student
    			return;    // raus aus der methode
    	}
    
    // NUN DAS GLEICHE MIT AE--------------------------------------------------------------------------------------------------------------------------
    
    	else if (eingabe == "AE") {                         //  wenn AE ausgewählt wurde
    
    				if (fachbereich.studiengang[AE]->get_anzahl() == 5) {                    // 0 = ti wenn getanzahl an ti die 5 gibt dann sind 5 ti,ler drinnen
    					cout << "Kein weiterer Student möglich" << endl << endl;
    					return;                                               // raus aus der methode
    					}
    
    		liste[studenten_zaehler] = new Student(name);  // bsp. studenten_zähler[0] = new student(eingegeber name) übergeben. konstr. student schreibt namen
    		liste[studenten_zaehler]->set_fachbereich(fachbereich.get_fb_name()); // liste[0] öffnet set_fachbereich und übergibt den geholten IEM namen
    		liste[studenten_zaehler]->set_studiengang(fachbereich.studiengang[AE]->get_sg_name()); //über fachbereich in HS, objekt von FB, greife ich auf objekt Studiengang zu und öffne die methode 
    
    		liste[studenten_zaehler]->set_pv(fachbereich.studiengang[AE]->get_pv_name(0), fachbereich.studiengang[AE]->get_pv_name(1));
    		// öffne set_pv (name) und übergebe per indirektem zugriff über rückggabewert den namen , je nachdem ob 0 oder 1 als attribut übergeben
    
    		cout << " Tragen Sie bitte Ihre Noten für die jeweilige Veranstaltung ein." << endl << endl;
    		cout << fachbereich.studiengang[AE]->get_pv_name(0) << ": ";  // 
    
    			do {
    				cin >> note;
    				cout << endl << endl;
    
    					if ((cin.fail()) || (note < 1) || (note > 5)) {
    						cerr << "Fehlerhafte Eingabe. Bitte versuchen Sie es noch einmal." << endl << endl;
    						cin.clear();
    						cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    						note = 0;
    					}
    				} while ((note < 0) || (note > 5));
    
    						liste[studenten_zaehler]->set_pv_note(liste[studenten_zaehler]->get_pv(0), note);    // übergebe kurs 0 = name und note 0 = note
    
    						cout << fachbereich.studiengang[AE]->get_pv_name(1) << ": ";  // 
    
    			do { 
    						cin >> note;
    						cout << endl << endl;
    
    						if ((cin.fail()) || (note < 1) || (note > 5)) {
    							cerr << "Fehlerhafte Eingabe. Bitte versuchen Sie es noch einmal." << endl << endl;
    							cin.clear();
    							cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    							note = 0;
    						}
    			   } while ((note < 0) || (note > 5));
    
    						liste[studenten_zaehler]->set_pv_note(liste[studenten_zaehler]->get_pv(1), note);    // übergebe kurs 0 = name und note 0 = note
    
    						fachbereich.studiengang[AE]->student_hinzugefügt();     // anzahl_studenten in studiengang erhöht
    						studenten_zaehler++;                                 // auch in hochschule ein weiterer student
    						return;                                             // raus aus der methode
    					}
    
    	else {
    						cout << "Unbekannter Studiengang" << endl << endl;
    						return;
    						}
    	}
    
    //-------------------------------------------------------------------------------------------------------------------------------------------------
    
    Fachbereich::Fachbereich(){
    	fb_name = "IEM";
    	studiengang[TI] = new Studiengang("Technische Informatik");        // 0 ist TI
    	studiengang[AE] = new Studiengang("Allgemeine Elektrotechnik");       // 1 ist AE
    
    	cout << "Der Fachbereich" << fb_name << " wurde erstellt";
    }
    
    string Fachbereich::get_fb_name() {
    	return fb_name;
    }
    
    //--------------------------------------------------------------------------------------------------------------------------------------------------------
    
    Studiengang::Studiengang(string name){               // konstruktor setzt PV namen
    	sg_name = name;
    	anzahl_studenten = 0;
    
    	if (sg_name == "Technische Informatik") {   // wenn studiengang[TI] aufruft name zurück und = TI , dann ...
    
    		pv_name[0] = "Softwaretechnik 2";
    		pv_name[1] = "Mathematik 1";
    	}
    
    	else {
    		pv_name[0] = "Softwaretechnik 1";   // wenn AE, dann ..
    		pv_name[1] = "Mathematik 1";
    	}
    
    	cout << "Ein Studiengang mit dem Namen ( " << name << " ) wurde erstellt." << endl;
    }
    
    int Studiengang::get_anzahl() {
    	return anzahl_studenten;
    }
    
    string Studiengang::get_sg_name() {
    	return sg_name;
    }
    
    string Studiengang::get_pv_name(int x) {
    	return pv_name[x];
    }
    
    void Studiengang::student_hinzugefügt() {
    	anzahl_studenten ++ ;
    }
    
    //-----------------------------------------------------------------------------------------------------------
    
    Student::Student(string neuer_name){            // erhält namen beim erstellen eines neuen students
    	name = neuer_name;                          // name wird lokal in name gespeichert
    	cout << "Ein neuer Student wurde angelegt." << endl << endl;
    }
    
    void Student::set_fachbereich(string name) {
    	fachbereich = name;
    }
    
    void Student::set_studiengang(string name) {
    	studiengang = name;
    }
    
    void Student::set_pv(string name1, string name2) {
    	kurs[0] = name1;
    	kurs[1] = name2;
    }
    
    void Student::set_pv_note(string pv_name, int note_pv) { /// ????????????????????????ß
    	kurs[0] = pv_name;
    	note[0] = note_pv;    // musterlösung hat ein  wenn note größer als 5 oder kleiner als 1
    
    	if (pv_name == kurs[0]) {
    		note[0] = note_pv;
    	}
    
    	else {
    		note[1] = note_pv;
    	}
    }
    
    int Student::get_pv_noten(string name_pv) {
    
    	if (kurs[0] == name_pv) {
    		return note[0];
    	}
    
    	else if (kurs[1] == name_pv) {
    		return note[1];
    	}
    
    	else{
    		cout << " Keine Noten hinterlegt " << endl << endl;
    		return 0;
    	}
    }
    
    string Student::get_name() {
    	return name;
    }
    
    string Student::get_fb() {
    	return fachbereich;
    }
    
    string Student::get_sg() {
    	return studiengang;
    }
    
    string Student::get_pv(int x) {
    	return kurs[x];
    }
    


  • Smuji schrieb:

    - Fehler C2143 Syntaxfehler: Es fehlt ";" vor "*" 16
    - Fehler C4430 Fehlender Typspezifizierer - int wird angenommen.
    - Fehler C2238 Unerwartete(s) Token vor ";" 16 letzteAufgabe

    Mich wundert, dass es bei ihm funktioniert, obwohl er es ähnlich hat.
    Weiß jemand Rat ?

    Da hast du wohl bei Copy&Paste einen Fehler gemacht oder am Code rumgewurschtelt. Die Fehlermeldungen oben beziehen sich darauf, dass der Compiler zu diesem Zeitpunkt die Klasse "Student" nicht kennt.

    Dafür gibt es zwei Lösungsvarianten:

    1. (unschön) du verschiebst die Deklaration der Klasse "Student" nach oben
    2. (sauber) Du erstellt eine Forward-Deklaration:
    // includes
    
    class Student; // Dem COmpiler mitteilen, dass es irgendwo eine Klasse "Student" gibt
    
    class Hochschule 
    {
    //...
    Student* liste[10];
    };
    
    class Student
    {
    // ...
    };
    

    edit: den Rest habe ich mir nicht sonderlich gut angesehen. Was mir aber spontan aufgefallen ist: Da gibt es diverse "new", aber kein einziges "delete".



  • danke.

    sind die "delete" zwingend notwendig ? habe sie extra erstmal weggelassen

    Variante 1 (unschön) habe ich ausprobiert und es sind aus 85 Fehler nun nur noch 30 geworden.

    Trotzdem erhalte ich noch die Meldung:

    Fehler C2079 "Hochschule::fachbereich" verwendet undefiniertes class "Fachbereich"

    bezogen auf:

    class Hochschule
    {
    	int studenten_zaehler;              // zählt die aktuell eingeschriebenen Studenten
    	Student *liste[10];                // 10 Studenten können in die THM
    	Fachbereich fachbereich;            // einen Fachbereich in die Hochschule integrieren (ein Objekt der Klasse Fachbereich)
    


  • Wenn du die deletes weglässt, hast du ein Speicherleck. Wird dir bei 10 Studenten nicht auffallen. Aber warum willst du dir eigentlich gleich so unsaubere Dinge angewöhnen? Verwende KEIN new! Dann brauchst du auch kein delete bzw. kannst es nicht vergessen.

    Nutze std::vector anstelle deiner Arrays + Indexvariablen.
    Nutze std::make_unique anstatt von new , wenn du Objekte auf dem Freispeicher erstellen willst.

    Lies dir insbesondere mal im Buch das Kapitel über std::vector durch.



  • Smuji schrieb:

    sind die "delete" zwingend notwendig ? habe sie extra erstmal weggelassen

    Nun, du könntest auch einfach Smart Pointer verwenden.

    Aber so wie du das hast: JA die sind notwendig! (zugegeben, du wirst in diesem Mini-Programm keine negative Auswirkungen feststellen, aber so einen Mist sollte man sich gar nicht erst angewöhnen)


Anmelden zum Antworten