Zum Inhalt springen

C++: Objekt B als Element von Objekt A


Kadaj

Empfohlene Beiträge

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 übersetzen

Fü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 von Klotzkopp
Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber ich hab doch die Vorwärtsdeklaration am Anfang gehabt
Wie 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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...