Klasse B und C sollen auf Klasse A zugreifen, aber wie???
-
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)