Erste Versuche in vererbung und assoziation



  • Moinmoin, habe bisher einige efahrung in java gemacht und wollte mir nun auch c++ aneignnen. Habe 3 einfache klassen gebaut: Student person und vorlesung, dabei soll student von person erben und vorlesung kennt student und student kennt vorlesung.
    Irgentwas mache ich glaube bei der vererbung und kenntnissbeziehung falsch.

    meine reihe an fehlermeldungen:
    1> vorlesung.cpp
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C3646: "studis": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C3646: "getStudi": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2059: Syntaxfehler: "("
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2238: Unerwartete(s) Token vor ";"
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(15): error C2061: Syntaxfehler: Bezeichner "student"
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.cpp(6): error C2011: "Vorlesung": "class" Typneudefinition
    1> c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(5): note: Siehe Deklaration von "Vorlesung"
    1> test.cpp
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C3646: "studis": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C3646: "getStudi": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2059: Syntaxfehler: "("
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2238: Unerwartete(s) Token vor ";"
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(15): error C2061: Syntaxfehler: Bezeichner "student"
    1> student.cpp
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C3646: "studis": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(8): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C3646: "getStudi": Unbekannter Überschreibungsspezifizierer
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2059: Syntaxfehler: "("
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(14): error C2238: Unerwartete(s) Token vor ";"
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\vorlesung.hpp(15): error C2061: Syntaxfehler: Bezeichner "student"
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\student.cpp(7): error C2011: "student": "class" Typneudefinition
    1> c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\student.hpp(7): note: Siehe Deklaration von "student"
    1> person.cpp
    1>c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\person.cpp(5): error C2011: "person": "class" Typneudefinition
    1> c:\users\boese\onedrive\documents\visual studio 2015\projects\hochschule\hochschule\person.hpp(5): note: Siehe Deklaration von "person"
    1> Code wird generiert...

    meine klassen .hpp`s, hoffe die .cpp`s werden nicht zusätzlich benötiget, darin definiere ich die methoden und falls wichtig die haben die gleichen includes wie ihre hpp jedoch mit dem spezifischen hpp zusätzlich, also student.cpp hat ein include auf student.hpp

    Vorlesung:

    #pragma once
    #include <string>
    #include "student.hpp"
    using namespace std;
    class Vorlesung {
    private:
    	string name;
    	student studis;
    
    public:
    	string getname();
    	void setname(string nam);
    	int getAnzahl();
    	student getStudi(int i);
    	void setStudi(student stud);
    
    	Vorlesung::Vorlesung();
    	Vorlesung::Vorlesung(string name);
    };
    

    Person:

    #pragma once
    #include <string>
    using namespace std;
    
    class person {
    private:
    	string name;
    public:
    	string getName();
    	void setName(string nam);
    
    	person::person();
    	person::person(string nam);
    };
    

    Student:

    #pragma once
    #include <string>
    #include "vorlesung.hpp"
    #include "person.hpp"
    using namespace std;
    
    class student : person {
    private:
    	int MatrNr;
    	Vorlesung Vorl;
    public:
    	int getMatrNr();
    	string getVorl();
    	void setMatrNr(int mat);
    	void setVorl(Vorlesung vor);
    
    	student::student();
    	student::student(string name, int mat);
    };
    

    und der Test:

    #pragma once
    #include <string>
    #include <iostream>
    #include "person.hpp"
    #include "student.hpp"
    #include "vorlesung.hpp"
    #include "test.h"
    
    using namespace std;
    int main() {
    	string aaa("bob");
    	person a (aaa);
    	student b ("Richard", 123);
    	student c ("Ilse", 333);
    	Vorlesung vo ("irgentwas");
    
    	cout << "Person" << a.getName() << endl;
    	b.setVorl(vo);
    	cout << "Vorlesung von b: " << b.getVorl() << endl;
    
    }
    

    Bisschen viel text geworden, aber ich habe keine ahnung was ich noch verbessern muss und wollte nicht das sich jemand beschwert zu wenig informationen zum helfen zu haben. Soll ja vorkommen.



  • Hallo,

    Stichwort: Cross-Include, s. mein Beitrag in Include Problem

    PS:
    Du hast noch ein anderes Problem:
    Ein Vorlesung kann nicht aus Student(en) bestehen und ein Student wiederum eine Vorlesung beinhalten! Ich denke, du brauchst in der Student-Klasse nur einen Verweis (Zeiger, Referenz, o.ä.) auf die Vorlesung.
    Insgesamt kommt mir dir Modellierung aber sehr eigenartig vor, denn ein Student besucht in der Regel ja mehrere Vorlesungen - oder was soll 'Vorl' in Student angeben (nur die aktuell besuchte Vorlesung)?



  • Kauf dir ein anständiges Buch!

    Du hast hier mehrere Probleme:

    1. auch in Java sollte es doch wohl so sein, dass eien Student mehrere Vorlesungen besuchen kann und eine Vorlesung mehrere teilnehmende Studenten hat. Wie soll das mit deinen Definitionen funktionieren?

    2. Im Gegensatz zu Java muss man in C++ sagen, dass man Pointer verwenden will. Du hast z.B. eine eigenständige Studenteninstanz in der Vorlesung.

    3. Beim übersetzen wird zunächst include durch den Inhalt der Datei ersetzt. Dies geschieht solange, bis kein include mehr übrigbleibt. Wenn wie bei dir A B einbindet und B A, gibt's 2 Probleme. Eins hast du mit pragma once erschlagen, portabel währen aber Includeguards. Das Zweite: eine Datai kommt immer zuerst. Somit kommt auch immer eine Klasse vor der anderen. Wenn du Pointer verwendest, kannst du das mit Vorwärtsdeklarationen lösen.



  • nun, selbstverständlich besucht ein student mehrere vorleungen und eine vorlesung wird vopn mehreren studenten besucht.
    allerdings wollte ich erst einmal eine grundsätzliche struktur aufbauen um anschließend die feinabstimmung zu machen.
    Die Vorlesung kann nur begrenzt viele studenten aufnehmen, also kann ich dies über ein standart array lösen mit einer definierten maximalen größe.

    ein student kann unterschiedlich viele vorlesungen besuchen, entweder auch ein maximum festlegen und standart array, oder aber dachte ich mir ein dynamischer arraytyp wie vektor.

    und getVorl wird die namen der Vorlesungen ausgeben die der student besucht, würde ich gerne über einen string managen der die namen der vorlesungen aneinanderhängt und anschließend wird dieser returnt.

    das mit der vorwärtsdeklaration wirkt gut, ich muss mir aber mal anschauen wie das genau funktioniert.
    So ganz weiß ich noch nicht wie man pointer dabei verwendet. aber vielen dank schonmal, das hilft mir dabei weiter zu arbeiten.^^



  • habt ihr vieleicht noch nen Tipp?

    Habe noch nicht mehrere vorlesungen in student, aber das kommt danach.
    angedahte lösung ein Vorlesungs-array und dann einen string mit getname zusammenbauen indem zu einem gesamtstring mit einer foreach schleife died einzelnen vorlesungsnamen ausgegeben werden.

    jetzt habe ich aktuell nur noch ein problem:

    Ziele 15, return Vorl->getname;:
    error C2276: "
    ": Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion

    #include <string>
    #include "student.hpp"
    using namespace std;
    
    	int student:: getMatrNr() {
    		return MatrNr;
    	}
    	void student::setMatrNr(int mat) {
    		MatrNr = mat;
    	}
    	string student:: getVorl() {
    		return *Vorl->getname;
    	}
    	void student:: setVorl(Vorlesung &v) {
    		*Vorl = v;
    	};
    	student::student() {
    
    	};
    	student::student(string name, int Mat):person(name)
    	{
    		setMatrNr(Mat);
    	};
    


  • xanath0s schrieb:

    Hier sind 25 Zeilen Code, in einer davon meldet der Compiler einen Fehler, ich sag aber nicht welche.

    Das ist ja wohl nicht dein Ernst.

    Und du hast sicher nur ein Problem: du hast nicht verstanden, was du da tust. Einfach mal irgendwo ein paar * reinrotzen macht noch lange kein C++ Programm.



  • Ziele 15, return *Vorl->getname;



  • Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion

    Du willst mit dem Ausdruck

    *Vorl->getname
    

    die methode getname dereferenzieren, was keinen sinn macht, den methoden kann man nicht dereferenzieren.



  • okay, tut mir leid ich spezifisiere meine frage:
    In Zeile 15 möchte ich als return den return von getname weiterleiten,
    dies ist eine methode in vorlesung welche das atribut string name enthält.
    ich habe in student nur eine referenz auf vorlesung, wie kann ich nun einen zugriff auf die Methode erlangen?



  • Eine Funktion wird immer mit Klammern aufgerufen:

    return Vorl->getname();
    

    PS: Du solltest dir auch eine einheitliche Schreibweise angewöhnen, z.B. immer alle Funktionen kleinschreiben oder konsequent CamelCase, also nicht mal getname(), dann getName().
    Das gleiche gilt dann auch für deinen anderen Namen, z.B. Klassen.



  • xanath0s schrieb:

    ich habe in student nur eine referenz auf vorlesung, wie kann ich nun einen zugriff auf die Methode erlangen?

    Wohl eher einen Zeiger.

    void student:: setVorl(Vorlesung &v) { 
            *Vorl = v; 
        };
    

    Das schreit geradezu nach Absturz. Der Zeiger ist garantiert nicht initialisiert. Und eine Kopie wolltest du ja auch nicht anlegen.


Log in to reply