Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C++: Objekt B als Element von Objekt A

Empfohlene Antworten

Veröffentlicht

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ß

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

  • Autor

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!

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.