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



  • so, bin gerade noch am schreiben und testen... ich habe nur eine kurze zwischenfrage:

    kann ich z.b. innerhalb einer methode der klasse Hochschule eine Instanz der klasse Fachbereich erstellen ?

    also bsp. Fachbereich abc; ?

    wenn ich das versuche, wird mir gesagt:

    Fehler (aktiv) E0020 Der Bezeichner ""abc"" ist nicht definiert.

    in main() kann ich ja objekte aller klassen erstellen, aber ich kann kein objekt der kalsse b innerhalb der klasse a erstellen ?



  • Code zeigen; ansonsten wirds mit Antworten schwierig ...



  • Also mein Menü sieht wie folgt aus:

    cout << "Technische Hochschule Mittelhessen - 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 << "Treffen Sie bitte jetzt Ihre Auswahl: " << endl << endl << endl;
    		cin >> auswahl;
    

    nun bin ich bei schritt 1, einschreiben.

    switch (auswahl) {
    
    		case 1:
    			thm[anzahl]->einschreiben_sg();
    			anzahl++;
    			break;
    
    ....
    ....
    ...
    

    in der Klasse Hochschule habe ich nun die Funktion "einschreiben_sg()" welche erst ein paar cout's (texte) ausgibt und dann per switch() fragt, in welchen studiengang man sich einschreiben möchte.

    nun sollen ja laut aufgabenstellung diese zur laufzeit(heap) neu erzeugt werden.
    dazu wollte ich´innerhalb dieser methode:

    Fachbereich *aeb;    // eine Instanz von Fachbereich erzeugen
    
    aeb = new Fachbereich("Informationstechnik - Kommunikationstechnik - Mechatronik");   // speicher anfordern und dem kontruktor die fachbereichsbezeichnung übergeben.
    

    nun ja, in mein färbt sich ja schon direkt das FACHBEREICH in türkis, also ich meine er erkennt, dass es sich um die klasse handelt.... aber innerhalb der methode (klasse hochschule) geht das nicht ?!?

    habt ihr ideen ?

    grüße smuji



  • ok, habe meinen fehler gefunden...habe dummerweise die definition aus meinem vorherigen projekt in die header-datei kopiert und da dort dann eine komplette definition zu sehen war, merkte ich nicht, dass ich gerade in der header schreibe =)....

    eine andere frage. ich würde gern ein objekt als array verwalten, und gern einen zähler verwenden

    a la

    int anzahl;
    
    Hochschule *thm[10];
    
    // und dann mit:
    
    thm[anzahl]  ... weiterarbeiten
    

    wie mache ich diesen zähler global ?!? also so, dass alle klassen und auch main() den aktuellen wert sehen, oder zur not auch bearbetien können ?

    habe versucht ihn in main() mit static int anzahl = 0 zu deklarieren.

    allerdings ist der zähler innerhalb der klassen dann unbekannt.

    muss ich noch eine definition in den klassen erstellen ? wenn ja, haben diese dann einen "eigenen" zähler, oder erkennen sie die veränderung in main () ?

    grüße smuji



  • Smuji schrieb:

    eine andere frage. ich würde gern ein objekt als array verwalten, und gern einen zähler verwenden

    int anzahl;
    
    Hochschule *thm[10];
    
    // und dann mit:
    
    thm[anzahl]  ... weiterarbeiten
    

    wie mache ich diesen zähler global ?!? also so, dass alle klassen und auch main() den aktuellen wert sehen, oder zur not auch bearbetien können ?

    Am besten gar nicht! Vermeide globale Variablen. Vermeide globale Variablen. Vermeide globale Variablen. Schreib "Vermeide globale Variablen." 100x auf einen Zettel. Erst danach solltest du über die Verwendung globaler Variablen nachdenken, dabei aber dich an den 100x geschriebenen Text erinnern.

    Verwende auch keine Arrays + Zähler. Nimm stattdessen einen std::vector<Hochschule*> . Bleibt nur noch die Frage, ob nicht ein std::vector<Hochschule> oder ein std::vector<std::unique_ptr<Hochschule>> sinnvoller wäre.



  • Danke, bin davon auch schon weg gekommen.

    Ich hänge gerade daran, wie ich das mit dem Einschreiben realisieren soll. Also wie letztlich die Ausgabe aussehen soll

    Bsp.:

    Es wird im Menü ausgewählt, dass sich der Student in einen Studiengang einschreiben will.
    Also muss ich verschiedene Methode durchlaufen...

    1. neuen Fachbereich erstellen und ihm über den Konstruktor einen Namen geben
    2. Den Studenten fragen in welchen Studiengang er sich einschreiben will
    3. Seinen Namen abfragen.

    Nun muss ja später eine Ausgabe erzeugt werden a la:

    Hans Müller hat sich im Fachbereich XYZ in den Studiengang ZYX eingeschrieben

    Also brauche ich ja in den Klassen irgendeinen "status" der gesetzt wird, damit ich später die richtige Ausgabe erzeugen kann.

    Bsp.:

    Student wählt Studiengang AEB, also setze ich dort den status auf 1 und später bei der Ausgabe Frage ich über if(status == 1) dann gebe AEB aus, if(status == 2) dann TI und wenn status = 0, dann kein Eintrag ?!?

    Naja, ich probiere es mal so...vllt. fällt mir ja eine bessere lösung noch ein.



  • Du sollst nicht für jeden Studenten einen Fachbereich erstellen. Orientiere dich da an der Realität.

    Man könnte sich z.B. überlegen, ob die Uni über Studenten (einen Vektor von Studenten) verfügt und jeder Student einen Pointer auf den Studiengang den er belegt. (Mal als lockere Anregung zur Umsetzung).



  • ok,

    habe es bald fertig und poste es dann hier...

    allerdings habe ich gerade das problem, dass ich eine abfrage mache:

    Fachbereich *objekt;                                   
    
    	if ((objekt->get_status() == 1) || (objekt->get_status() == 2)) {                     
    	objekt->set_kurs();                                                                                                     
    	}
    

    bitte erstmal nicht über den sinn diskutieren, das machen wir wenn ich fertig bin, mich interessiert nur, warum ich fehler:

    Fehler C2059 Syntaxfehler: "||"

    bekomme, also ich möchte gern eine ODER-abfrage starten, ich habe schon versucht,

    #include <conio.h>
    #include <stdbool.h>

    einzubinden.... oder benutze ich die falschen tasten für das ODER ? oder sitzen meine klammern falsch?

    zumindest geben meine methoden entweder den wert 1 oder 2 zurück.

    EDIT::

    habe es nun versucht mal anders zu lösen, um überhaupt die funktion zu testen:

    void Hochschule::einschreiben_kurs() {
    
    	Fachbereich *objekt;     
    
    	if (objekt->get_status() == 1) {                     
    		objekt->set_kurs();                                                                                                     
    	}
    
    	else if (objekt->get_status() == 2) {
    		objekt->set_kurs();
    	}
    
    	else {
    		cout << "Bitte zuerst in einen Studiengang wählen !!" << endl << endl;                               
    	}
    }
    

    **
    Fehler:

    Fehler C4700 Die nicht initialisierte lokale Variable "objekt" wurde verwendet.**

    was ist denn nun wieder falsch ?



  • Smuji schrieb:

    allerdings habe ich gerade das problem, dass ich eine abfrage mache:

    Fachbereich *objekt;                                   
    
    	if ((objekt->get_status() == 1) || (objekt->get_status() == 2)) {                     
    	objekt->set_kurs();                                                                                                     
    	}
    

    bitte erstmal nicht über den sinn diskutieren

    Das lasse ich mir nicht vorschreiben. Vermeide es, magische Zahlen wie 1, 2, etc. für etwas anderes als offensichtliche Dinge zu verwenden. Welcher Studiengang ist "1", welcher "2"? Wenn du sowas hart verdrahten willst (würde ich von abraten, da sich Studiengänge und Fachbereiche auch ändern können), solltest du wenigstens ein enum verwenden.

    , das machen wir wenn ich fertig bin, mich interessiert nur, warum ich fehler:

    Fehler C2059 Syntaxfehler: "||"

    bekomme, also ich möchte gern eine ODER-abfrage starten,

    Das ist die vollständige Fehlermeldung? Kommt mir aber sehr kurz vor!

    ich habe schon versucht,

    #include <conio.h>
    #include <stdbool.h>

    einzubinden.... oder benutze ich die falschen tasten für das ODER ? oder sitzen meine klammern falsch?

    Die includes haben damit rein gar nichts zu tun! Die Klammern sehen auf den ersten Blick auch richtig aus. Also ist dein Fehler anderswo.

    Edit: zu deinem Edit:
    Das steht doch in der Fehlermeldung des Compilers! Du hast einen nicht initialisierten Pointer auf einen Fachbereich namens objekt dereferenziert. Was soll denn da rauskommen? (welcher Fachbereich soll das sein, es wurde keiner zugewiesen!)



  • erstmal vielen dank für deine ausführliche antwort.

    wie genau meinst du das ? ich verstehe deine antwort nicht ganz.

    "Das steht doch in der Fehlermeldung des Compilers! Du hast einen nicht initialisierten Pointer auf einen Fachbereich namens objekt dereferenziert. Was soll denn da rauskommen? (welcher Fachbereich soll das sein, es wurde keiner zugewiesen!)
    "

    wie muss sowas aussehen ?
    ich vermute ich habe also ziemlich vieles falsch, da die anderen 5 fehlermeldungen mit objekten sich auf andere klassen beziehen.

    ich habe den fehler überall dort wo ich innerhalb der klasse X auf eine methode der klasse Y zuzugreifen

    da bin ich wieder bei meinem alten problem.

    wenn ich in main() eine methode der klasse Ingo aufrufen möchte, kann ich doch einfach:

    Ingo Objekt;
    Objekt.methode();

    machen.

    Nur wenn ich innerhalb einer methode der Klasse Hans bin und dort die Methode der Klasse Ingo aufrufen möchte. Wie mache ich das ?

    Wenn ich dort nun obiges reinschreibe, bekomme ich einen Fehler.

    Daher dachte ich;

    Ingo *Objekt;
    Objekt->methode()



  • Smuji schrieb:

    Nur wenn ich innerhalb einer methode der Klasse Hans bin und dort die Methode der Klasse Ingo aufrufen möchte.

    Versuche erstmal, die Begriffe "Klasse" und "Instanz einer Klasse" auseinanderzuhalten.

    Du möchtest die Methode für ein ganz bestimmtes Objekt (= Instanz der Klasse) aufrufen. Diese Instanz muss also in der Methode bekannt sein. Entweder du übergibst sie der Methode oder die Instanz wird als Member in der Klasse gehalten.



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


Anmelden zum Antworten