Klasse B und C sollen auf Klasse A zugreifen, aber wie???
-
Hallo liebe Community,
erstmal will ich mich vorstellen mein Name ist Chris und ich bin neu in der C++ Welt. Mein Problem ist denke ich mal für euch ziemlich einfach.
Ich versuche jetzt seit 12 Stunden dieses Problem zu lösen, ja die Zeit ist nicht übertrieben ich habe Videos, Bücher, Foren usw gelesen bzw. geschaut.
Zum Fehler den mir mein Compiler ausspuckt:Hochschule.cpp:47:23: error: ‘mystudent’ was not declared in this scope
cout << mystudent->get_name << "hat den Bachelor mit der Note: "Nun zu meinem Code:
#include <iostream> #include <string.h> using namespace std; class student { private: string name = "Random"; int matr = 0; string bachelor = "Random"; float nc = 0.0; friend class imma; public: void set_nc(float temp){nc = temp;} float get_nc(){return nc;} void set_matr(int temp){matr=temp;} int get_matr(){return matr;} void set_bachelor(string temp){bachelor = temp;} string get_bachelor(){return bachelor;} string get_name(){return name;} student() { cout << "Bitte geben Sie den Namen des Studenten ein" << endl; getline(cin, name); cout << "Bitte geben Sie die Matrikelnummer des Studenten an!" << endl; cin >> matr; } ~student() { cout << "Der Student wurde gelöscht" << endl; } }; class imma { public: void anlegen() { cout << "Der Student wurde angelegt!!!" << endl << endl; student *mystudent = new student; } void info() { cout << mystudent->get_name << "hat den Bachelor mit der Note: " << mystudent->get_nc << endl; } }; class prof { private: public: void pruefen() { cout << "Bitte geben Sie den NC des Studenten ein" << endl; float temp; cin >> temp; mystudent->set_nc(temp); } }; int main () { imma Muenchen; Muenchen.anlegen(); Muenchen.info(); prof.pruefen(); return 0; }Nun zu den Teilen die nicht funktionieren:
1. Die Methode void info() aus der Klasse imma
2. Die Methode void pruefen() aus der Klasse profDen Rest habe ich ausprobiert der funktioniert mein Problem wie gesagt ist der Zugriff auf die Klassen. Ich werde daraus einfach nicht Schlau!
Ich hoffe es gibt jemanden der mir helfen kann mittlerweile bin ich am verzweifeln.
-
Chris1991 schrieb:
Hochschule.cpp:47:23: error: ‘mystudent’ was not declared in this scope
cout << mystudent->get_name << "hat den Bachelor mit der Note: "Und auf welche Variable
mystudentin der Funktioninfo()beziehst Du Dich?
-
Ich möchte in void info() einmal den Namen sowie den NC des Studenten haben.
Mir ist klar des der am Anfang noch 0.0 ist, da kommt dann void pruefen() der Klasse prof ins Spiel, dort soll er geändert werden, wenn ich danach dann wieder in der Main den Aufruf void info() mache dann der neue NC gespeichert ist.Ich hoffe das beantwortet deine Frage.
Vielen Dank für die schnelle Reaktion!
-
my_stdent ist Lokal?
-
Naja da bin ich mir immer nicht so sicher wo es am geschicktesten ist mystudent mit new zu erzeugen also an welcher stelle im code. Ich habe mir gedacht wenn ich das imma aufrufe (das steht für Immatrikulationsamt) soll der student angelegt werden. Das ganze natürlich mit new weil es ja dann auf dem Heap ist, wenn ich soweit jetzt nichts falsch verstanden habe.
Naja eigentlich ist das ja die ganze Zeit vorhanden weil ich ja in meinem Destruktor kein Delete machen. Ich weis eben nicht mit welchem Bezugsrahmen operator ich jetzt auf die einzelnen Attribute zugreifen kann. Bzw. wie ich das aus den anderen Klassen heraus machen kann.
-
class imma { public: void anlegen() { cout << "Der Student wurde angelegt!!!" << endl << endl; student *mystudent = new student; } void info() { cout << mystudent->get_name << "hat den Bachelor mit der Note: " << mystudent->get_nc << endl; } };Es ist in Zeile 11 keine Variable Namens
mystudentim Scope (deutsch: Sichtbarkeitsbereich).
In imma::info() wird keine Variablemystudenterstellt. In der Klasse imma gibt es kein Member namensmystudentund eine globale Variable gleichen Namens gibt es auch nicht.mystudentexistiert nicht in Z.11: Das sagt die Fehlermeldung.Z. 7 ist ein komplett anderer Scope, der in Z. 8 wieder endet. Mit der schließenden Klammer von
imma::anlegen().Dein Compiler sollte Dich auch davor warnen, dass die Variable mystudent aus. Z. 7 nie benutzt wird.
Warnlevel erhöhen!test.cc: In member function ‘void imma::anlegen()’: test.cc:44:14: warning: unused variable ‘mystudent’ [-Wunused-variable] student *mystudent = new student;
-
mystudent wird aber nur als lokaler Pointer innerhalb der Funktion anlegen instanziert. Sobald die Funktion verlassen wird, wird der Pointer wieder gelöscht.
-
Ok das habe ich voll und ganz verstanden.
Jetzt resultiert daraus mein Problem wie und wo lege ich dann meine Studenten an damit ich sie in jeder Klasse aufrufen und verändern kann?
Um diese Frage vielleicht beantworten zu können erkläre ich kurz nochmal den eigentlich Sinn dahinter.
Ich habe 3 Klassen.
1. Das imma in dem ich meine Studenten anlegen bzw. mir Informationen über Sie ausgeben lassen kann.
2. Die Studenten mit den Attributen
3. Den prof der einfach nur den NC verändern kann.
-
mystudent als private member in imma.
imma.getstudent gibt Referenz darauf zurück.
Prof.prüfen kriegt diese Referenz als Parameter.
-
Auf keinen Fall als globale Variable.
-
Geht das dann eher in diese Richtung bin mir aber da nicht ganz so sicher?
class student { private: string name = "Random"; int matr = 0; string bachelor = "Random"; float nc = 0.0; public: friend class prof; friend class imma; void set_nc(float temp){nc = temp;} float get_nc(){return nc;} void set_matr(int temp){matr=temp;} int get_matr(){return matr;} void set_bachelor(string temp){bachelor = temp;} string get_bachelor(){return bachelor;} string get_name(){return name;} student() { cout << "Bitte geben Sie den Namen des Studenten ein" << endl; getline(cin, name); cout << "Bitte geben Sie die Matrikelnummer des Studenten an!" << endl; cin >> matr; } ~student() { cout << "Der Student wurde exmatrikuliert" << endl; } }; class imma { private: student *mystudent = new student; public: student *get_student(){return mystudent;} void registrieren() { mystudent->set_bachelor; cout << "Der Student wurde vollständig angelegt!!!" << endl << endl; } void info() { cout << mystudent->get_matr << "/t"; cout << mystudent->get_name << " hat den Bachelor mit der Note: " << mystudent->get_nc() << " bestanden!" << endl; } }; class prof { public: void pruefen() { cout << "Bitte geben Sie den NC des Studenten " << mystudent->get_name << "ein!" << endl; float temp; cin >> temp; mystudent->set_nc(temp); } }; int main () { imma Muenchen; Muenchen.registrieren(); Muenchen.info(); prof.pruefen(); return 0; }Ich entschuldige mich für den Code vorhin habe jetzt herausgefunden wie man das Highlighting verwenden kann ^^ wird also nicht mehr passieren.
-
So ungefähr. Parameter bei prüfen() fehlt noch. Bei manchen mystudent->xxx Funktionen fehlen die Klammern. Außerdem würde ich keinen Code im constructor von Student aufrufen, sondern Name und Nummer als Parameter übergeben.
-
Vielen Dank schon mal soweit, jetzt das nächste Problem! Hier der Code und soweit funktioniert alles bis auf ein Problem.
#include <iostream> #include <string.h> using namespace std; class student { private: string name = "Random"; int matr = 0; string bachelor = "Random"; float nc = 0.0; public: friend class prof; friend class imma; void set_nc(float temp){nc = temp;} float get_nc(){return nc;} void set_matr(int temp){matr=temp;} int get_matr(){return matr;} void set_bachelor(string temp){bachelor = temp;} string get_bachelor(){return bachelor;} void set_name(string temp){name = temp;} string get_name(){return name;} student() { cout << "Der Student wurde immatrikuliert!" << endl; } ~student() { cout << "Der Student wurde exmatrikuliert" << endl; } }; class imma { private: student *mystudent = new student; public: student *get_student(){return mystudent;} void registrieren(student *mystudent) { cout << "Bitte geben Sie den Namen des Studenten ein" << endl; string temp; getline(cin, temp); mystudent->set_name(temp); cout << "Bitte geben Sie die Matrikelnummer des Studenten an!" << endl; int tempmatr; cin >> tempmatr; mystudent->set_matr(tempmatr); cout << "Welchen Abschluss strebt der Student an?" << endl; cin >> temp; mystudent->set_bachelor(temp); cout << "Der Student wurde vollständig angelegt!!!" << endl << endl; } void info(student *mystudent) { cout << mystudent->get_matr() << " "; cout << mystudent->get_name() << " hat den " << mystudent->get_bachelor(); cout << " mit der Note: " << mystudent->get_nc() << " bestanden!" << endl; } }; class prof { public: void pruefen(student *mystudent) { cout << "Bitte geben Sie den NC des Studenten " << mystudent->get_name() << "ein!" << endl; float temp; cin >> temp; mystudent->set_nc(temp); } }; int main () { student *Paul; imma Muenchen; Paul = Muenchen.get_student(); Muenchen.registrieren(Paul); Muenchen.info(Paul); prof::pruefen(Paul); return 0; }Bei der Zeile ganz unten vor return kommt folgender Fehler:
cannot call member function ‘void prof::pruefen(student*)’ without object
prof::pruefen(Paul);Jedoch übergebe ich ja auch hier das Objekt mystudent darum verstehe ich nicht wirklich warum er hier mosert.
-
Prof ist ja ne nicht-statische klasse. D.h. Du brauchst erst ein Objekt von Prof, damit du seine memberfunction aufrufen kannst.
-
So ich schulde dir ein riesen großes Dankeschön!
Vielen Lieben Dank Joemu!!!!!!!!!!!!!!!!!! 
Habe jetzt den Prof auch angelegt und der Code funktioniert.Soll man jetzt in einem Forum den funktionierenden Code posten oder nicht?
Ist mein erstes mal das ich um Hilfe gefragt habe in einem Forum,
und ich muss schon sagen ich bin mehr als nur begeistert.
Echt spitze hier!Ich wünsche aber schon mal eine Gute Nacht!
P.s. Nochmal vielen vielen Dank!
-
Kein Problem, hab gerne geholfen. Btw. ich persönlich bin kein Fan vom Posten fertigen Codes. Verleidet zum copy&paste ohne nachzudenken

Gute Nacht
-
Mich interessiert jetzt noch,
- warum es ein Zeiger auf Student sein muss und
- wer den mit dem Zeiger verbundenen Speicher nachher wieder freigibt.
-
Hast du hierzu eine konkrete Aufgabenstellung?
(Entweder vorgegeben oder selbst vorgenommen)