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



  • Nein, du sollst nicht generell mit Büchern Feuer machen. Es wurde dir nur gesagt, dass dein C++ Buch von Jürgen Wolf nur dazu zu gebrauchen ist. Und das stimmt allerdings. Vielleicht ist es noch zu anderen Sachen zu gebrauchen, aber definitiv nicht um C++ zu lernen.

    Du hast offensichtlich Verständnisprobleme bei Vererbung und Aggregation(oder Komposition). Das sind Dinge, die du dir erst ein Mal beibringen musst. Dummerweise kann man die Aufgabe komplett ohne Vererbung realisieren, das kommt vllt erschwerend hinzu.

    Fang erst ein mal klein an und lös die Aufgabe rückwärts. Fang nicht mit der Hochschule an, sondern mit Student, Vorlesungsfach und deren Zusammenhänge. Den Rest bauste dann nach und nach dazu.

    Edit:
    manni66 ist halt so. Auf den ersten Blick sieht das schroff und abweisend aus, soll dich aber subtil dazu bringen, dir Fragen zu stellen und die Antworten darauf zu suchen. Ist manchmal vllt zu subtil 😉



  • Auf Basis der Aufgabenstellung und da du ja irgendwie nichts liest was man dir schreibt noch mal eine kleine Hilfestellung.

    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

    Das sollte als erste Hilfestellung reichen. - Entspricht aber so ziemlich dem, was dir bereits erklärt wurde. Geerbt wird hier bitte von keiner anderen Klasse.



  • @docshoe:

    danke erstmal. aber welches buch ist denn empfehlenswerter ?

    den rest werde ich mal so probieren.

    zu deiner aussage: Du hast offensichtlich Verständnisprobleme bei Vererbung und Aggregation(oder Komposition). Das sind Dinge, die du dir erst ein Mal beibringen musst. Dummerweise kann man die Aufgabe komplett ohne Vererbung realisieren, das kommt vllt erschwerend hinzu.

    ja! mag sein! mein buch ist ja nur zum verbrennen geeignet. aber ich wüsste auch nicht welches besser ist. in amazon sind die bewertungen dazu ganz gut gewesen.

    @inflames2k: was genau lese ich denn nicht ? zu den containern hatte ich eine gegenfrage gestellt, die du offenbar nicht gelesen hast, da keine reaktion. damit ich weitermachen kann interpretiere ich jetzt container mal als "sammelstelle".

    deine letztere hilfestellung sieht schonmal gut aus. ich versuche mich mal daran. danke



  • Smuji schrieb:

    @inflames2k: was genau lese ich denn nicht ? zu den containern hatte ich eine gegenfrage gestellt, die du offenbar nicht gelesen hast, da keine reaktion. damit ich weitermachen kann interpretiere ich jetzt container mal als "sammelstelle".

    Mehrere Sachen hast du nicht gelesen. - In Bezug auf die Container: Da hast du von anderer Stelle Antworten erhalten.



  • Jetzt leg mal deinen verletzten Stolz zur Seite.
    "Der C++ Programmierer" von Ulrich Breymann ist top und jeden Cent wert.



  • Interpretiere "container" als "Bauplan". So wie dein Auto Reifen, Karosserie, etc. hat, hat eine Hochschule (in dem Universum der Aufgabe) Fachbereiche.

    Da dein Auto kein Auto ist, wenn man einfach nur dessen Einzelteile irgendwo in der Gegend verstreut, macht es Sinn die Einzelteile zu diesem Konstrukt zusammenzufassen und das generelle Konstrukt dann eben Auto zu nennen.
    Das gleiche gilt für die Hochschule. Du kannst dir die Einzelteile, wie Noten, Studenten, Fächer, etc. aufbauen, musst sie aber danach noch zu einem sinnvollen Konstrukt zusammenführen - eben deine Klasse Hochschule.



  • vbert schrieb:

    Interpretiere "container" als "Bauplan". So wie dein Auto Reifen, Karosserie, etc. hat, hat eine Hochschule (in dem Universum der Aufgabe) Fachbereiche.

    Sehr schön, du weißt hoffentlich dass die Aussage vollkommener Quatsch ist? Container ist hier im Sinne einer Zusammenstellung, Aufzählung oder ähnlichem gemeint, die über die Klasse Hochschule gekapselt wird.



  • inflames2k schrieb:

    Sehr schön, du weißt hoffentlich dass die Aussage vollkommener Quatsch ist? Container ist hier im Sinne einer Zusammenstellung, Aufzählung oder ähnlichem gemeint, die über die Klasse Hochschule gekapselt wird.

    Ja, wenn du es ganz genau nimmst, dann ist ein Bauplan zu spezifisch um logisch äquivalent mit dem Konzept einer Klasse zu sein.
    Ich denke der restliche Text bringt es aber ganz gut rüber.
    Besser zu mindestens als 10 mal das Wort "container" zu wiederholen. Das scheint offensichtlich nicht zu helfen.
    Hätte ich "Aufzählung" gesagt, dann hätte er sich wieder gefragt, was er mit der Klasse soll. Aufzählen kann man auch so.
    Deswegen habe ich ein reales Objekt verwendet, mit dem er eventuell etwas anfangen kann.

    Keine Ahnung warum ihr immer in so einem untermenschlichen Ton schreiben und alles immer total überspitzt formulieren müsst. Kannst auch wie ein normaler Mensch schreiben, dass du das nicht korrekt findest und es richtigstellen.



  • Kann ich schon nachvollziehen das der Ton manchmal rauer wird.
    Ist ja auch nicht so das es ausser dem "Buch" von JWolf keine andere Möglichkeit geben würde sich die !mehrmals! genannten Schlagwörter Vererbung/Komposition/Aggregation durchzulesen.
    Zumal hier das Problem ja erstmal nicht am Verständnis des C++ - Codes, sondern an der OOP an sich liegt. Und wenn dann, gerade die Vielposter hier im Forum, im Ton rauer werden, trotzdem aber immernoch ihre Hilfe anbieten, sollte man das schon verkraften können.

    Ansonsten ist das was inflames2k geschrieben hat als Anleitung ja absolut zu gebrauchen.

    Auf die Umsetzung der Noten/Student - Geschichte bin ich jedenfalls mal gespannt 🙂



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


Anmelden zum Antworten