Gegenseitige Header importe
-
Ne, habe ich noch nicht verwendet
Weiss leider auch nicht so wirklich wie, also wie ich es jetzt gemacht habe geht es nicht.
Kurs.h
#pragma once #include "Student.h" #include <string> using std::string; #include <list> using std::list; #ifndef "Dozent.h" #define "Dozent.h" class Kurs { ... }; #endifDozent.h
#pragma once #include "Person.h" #include <string> using std::string; #include <list> using std::list; #ifndef "Kurs.h" #define "Kurs.h" class Dozent : public Person { ... }; #endifKannst du bitte mal erklären, wie ich das richtig einbinde.
Danke
NiBurhe
-
#ifndef INCLUDED_KURS_H #define INCLUDED_KURS_H #pragma once #include "Student.h" #include <string> using std::string; #include <list> using std::list; class Kurs { ... }; #endifDozent.h
#ifndef INCLUDED_DOZENT_H #define INCLUDED_DOZENT_H #pragma once #include "Person.h" #include <string> using std::string; #include <list> using std::list; class Dozent : public Person { ... }; #endifKannst du bitte mal erklären, wie ich das richtig einbinde.
Danke
NiBurhe[/quote]
-
Danke, aber irgendwie klappt das nicht so ganz, muss ich noch was beachten, wenn ich diese Header Dateien dann include?
1>Dozent.cpp 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C2146: syntax error : missing ';' before identifier '_dozent' 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(22) : error C2061: syntax error : identifier 'Dozent' 1>Uni.cpp 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C2146: syntax error : missing ';' before identifier '_dozent' 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(22) : error C2061: syntax error : identifier 'Dozent'In den Zeilen 18 und 22 wird das Object Dozent verwendet.
MfG
NiBurhe
-
Schreibe eine Declaration class Dezent; in 'Kurs.h'
#ifndef INCLUDED_KURS_H #define INCLUDED_KURS_H #pragma once #include "Student.h" #include <string> using std::string; #include <list> using std::list; class Dozent; class Kurs { ... }; #endif
-
Leider immer noch ohne gewünschten Erfolg
Kurs.h#ifndef INCLUDED_KURS_H #define INCLUDED_KURS_H #pragma once #include "Student.h" #include "Dozent.h" #include <string> using std::string; #include <list> using std::list; class Dozent; class Kurs { private: string _thema; int _semester; list<Student> _studenten; Dozent _dozent; //Zeile 19 int getAnzahlTeilnehmer(); public: Kurs(string thema, int semester, Dozent dozent); void zeigeKursteilnehmer(); string add(Student student, list<Kurs> kurse); }; #endifführt zu
1>d:\dateien\visual studio 2008\projects\uni\uni\kurs.h(19) : error C2079: 'Kurs::_dozent' uses undefined class 'Dozent'MfG
NiBurhe
-
Bemerkung:
Entweder man verwendet #define Header Guards oder das #pragma once, aber nicht beides zusammen. Macht keinen Sinn.
Simon
-
NiBurhe schrieb:
ich habe das Problem, dass ich nicht weiss, wie ich unter Visual C++ 2008 Express Header gegenseitig importieren kann.
Zyklische Includes in Headern sind nicht möglich!
Stell dir folgendes vor: wann immer du ein Inklude findest, musst du das Ziel kopieren... header1 inkludierst header2, header1 inkludiert header2...
Dies umgeht man u.a. Durch "Vorwärtsdeklaration".
http://www.c-plusplus.net/forum/viewtopic-var-p-is-285396.html
und weitere...cu André
P.S: Zudem achte darauf das die Includeguards eindeutig benannt werden.
-
Ich weiss leider weder was das erste noch was das zweite macht, ich versuche nur einfach das Programm zum laufen zu bekommen, weil sowas bei unserer tollen C/C++ vorlesung nie genannt wurden ist.
MfG
NiBurhe
-
1. Forward Deklarationen a la "class Dozent;" funktionieren nur im Zusammenhang mit Pointern od. Referenzen.
2. Entweder includieren des headers od. forwärts deklarieren. Nicht beides.
3. Benutze in Headern niemals using (namespace) directiven. Immer den vollen namen benutzen. Dies würde den Sinn der namespaces zunichte machen.
4. Schaue dir bei Gelegenheit mal parameterübergabe per Referenz (insbes. const) an.
5. Was möchtest Du mit
string add(Student student, list<Kurs> kurse);erreichen?
Hier ein wenig Code:
Kurs.h
#pragma once #include "Student.h" #include "Dozent.h" #include <string> #include <list> class Kurs { private: std::string _thema; int _semester; std::list<Student> _studenten; Dozent _dozent; int getAnzahlTeilnehmer(); public: Kurs(string thema, int semester, Dozent dozent); void zeigeKursteilnehmer(); string add(Student student, list<Kurs> kurse); };Person.h
#pragma once class Person { // .... };Dozent.h
#pragma once #include "Person.h" class Dozent : public Person { // .... };Student.h
#pragma once #include "Person.h" class Student : public Person { // .... };Gruss Simon
-
Danke an alle, jetzt läuft es.
zu 5.
Es gibt eine Liste mit Kursen, jeder Kurs hat eine Liste von Studenten die daran teilnehmen. Damit soll einem bestimmten Kurs ein Student zugeordnet werden, aber der Student darf nur in 20 Kursen sein, deshalb brauche ich die Liste um zu überprüfen, ob der Student schon 20 Kurse belegt.
Das ganze soll so wenig redundant wie möglich sein, damit ich nur den Studenten aus der Liste löschen muss.MfG
NiBurhe