Kadaj Geschrieben 16. Juni 2012 Teilen Geschrieben 16. Juni 2012 Hallo, ich hantiere grade ein wenig mit ein paar Beispielen zum THema Objekten rum. In folgendem Beispiel versuche ich das Objekt date als Element von person zu definieren: //member.h #include <iostream> #include <cstring> using namespace std; class person; class date; class person{ private: char *name; bool geschlecht; date Geb; public: enum geschlecht {MANN,FRAU}; person(); ~person(); void enter(); void show_member(); void show_data(); }; class date{ private: int day; int month; int year; public: friend class person; date(); date(int d, int m,int y); void set_date(); void get_date(); }; person::person(){ name = new char[ strlen("noname") + 1 ]; strncpy(name,"noname",strlen("noname")); name[ strlen("noname") + 1 ] = 0; geschlecht = MANN; Geb = date(); } person::~person(){ cout << name << " ist aus dem Rennen\n"; delete [] name; } void person::enter(){ char puffer[24]; cout << "Name: "; cin.ignore(); cin.getline(puffer,24); name = new char[ strlen(puffer) + 1 ]; strncpy(name,puffer,strlen(puffer)); name[ strlen(puffer) + 1 ] = 0; cout << "MANN oder FRAU? "; cin >> geschlecht; Geb.set_date(); } void person::show_member(){ Geb.get_date();} void person::show_data(){ cout << "Name: " << name << "("; if(geschlecht == FRAU) cout << "weiblich)"; else cout << "männlich)"; show_member(); } date::date(){ day = 1; month = 1; year = 2000; } date::date(int d, int m,int y){ day = d; month = m; year = y; } void date::set_date(){ cout << "Eingabe für: Tag: "; cin >> day; cout << "Eingabe für: Monat: "; cin >> month; cout << "Eingabe für: Jahr: "; cin >> year; } void date::get_date(){ cout << "Geburtsdatum: " << day << "." << month << "." << year << endl; } [/PHP] Der Compiler sagt: [PHP]In file included from member.cpp:1:0: member.h:14:10: error: field ‘Geb’ has incomplete type member.h: In constructor ‘person::person()’: member.h:45:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::enter()’: member.h:65:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::show_member()’: member.h:69:5: error: ‘Geb’ was not declared in this scope Das ist echt seltsam. 14 entspricht der Zeile "date Geb;". Muss ich an der Stelle an Stelle von class date(); ganz einfach class person::date(); verwenden? Wenn ich das aber mache, dann bekomme ich vom Compiler nur noch mehr Fehler: In file included from member.cpp:1:0: member.h:7:15: error: ‘date’ in ‘struct person’ does not name a type member.h:14:5: error: ‘date’ does not name a type member.h:25:19: error: qualified name does not name a class before ‘{’ token member.h: In constructor ‘person::person()’: member.h:45:5: error: ‘Geb’ was not declared in this scope member.h:45:16: error: ‘date’ was not declared in this scope member.h: In member function ‘void person::enter()’: member.h:65:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::show_member()’: member.h:69:5: error: ‘Geb’ was not declared in this scope member.h: At global scope: member.h:80:1: error: ‘date’ does not name a type member.h:86:1: error: ‘date’ does not name a type member.h:93:6: error: ‘date’ has not been declared member.h: In function ‘void set_date()’: member.h:95:12: error: ‘day’ was not declared in this scope member.h:97:12: error: ‘month’ was not declared in this scope member.h:99:12: error: ‘year’ was not declared in this scope member.h: At global scope: member.h:102:6: error: ‘date’ has not been declared member.h: In function ‘void get_date()’: member.h:103:33: error: ‘day’ was not declared in this scope member.h:103:47: error: ‘month’ was not declared in this scope member.h:103:63: error: ‘year’ was not declared in this scope[/PHP] Wenn ich allerdings aus "date Geb;" einfach "date *Geb;" mache, dann lässt es sich übersetzen, was ja schonmal ganz schön ist, aber ich wollte, dass es auch so funktioniert. Was mach ich denn falsch? person als friend von date innerhalb von date zu definieren hat auch nichts gebracht. Wobei ich auch noch nicht ganz verstanden habe wozu ich friend brauche, wenn ich doch ohnehin nicht auf dessen private-Variablen zugreifen kann und die Methoden, die public sind auch so aufrufen kann. Ich hoffe ihr wisst was das Problem ist. Ich will einfach, dass date ein Element von person ist, aber nicht als Pointer oder Referenz. Kann jemand Abhilfe schaffen? Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Juni 2012 Teilen Geschrieben 16. Juni 2012 (bearbeitet) Wenn date ein Member von person sein soll, muss die Klassendefinition von date vor der von person stehen. Wenn ich allerdings aus "date Geb;" einfach "date *Geb;" mache, dann lässt es sich übersetzenFür eine Zeiger oder eine Referenz reicht eine Forward Declararation (class date;). Und bitte bitte benutz std::string statt dynamischer char-Arrays. Du machst da einiges falsch, das du mit std::string gar nicht falsch machen kannst. Bearbeitet 16. Juni 2012 von Klotzkopp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 17. Juni 2012 Autor Teilen Geschrieben 17. Juni 2012 Unglaublich :beagolisc kein Fehler mehr, aber ich hab doch die Vorwärtsdeklaration am Anfang gehabt:confused: Das hieße ja, dass ich zum Beispiel date nicht als member von person und gleichzeitig person als member von date deklarieren kann? Danke dir! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 17. Juni 2012 Teilen Geschrieben 17. Juni 2012 aber ich hab doch die Vorwärtsdeklaration am Anfang gehabtWie gesagt, eine Forward Declaration reicht aus für Referenz- oder Zeigermember. Das hieße ja, dass ich zum Beispiel date nicht als member von person und gleichzeitig person als member von date deklarieren kann?Richtig. Das würde aber sowieso nicht funktionieren, denn dann hättest du in einer person ein date, das wieder eine person enthält. Da sich ein Objekt nicht selbst enthalten kann (das wäre eine nicht terminierende Rekursion), ist es nicht weiter tragisch, dass die Sprachstruktur das nicht ermöglicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.