Forum: PC-Programmierung Vererbung mit mehereren Dateien in cpp


von Matze (Gast)


Lesenswert?

Hallo,

Ich frage mich wie Vererbung funktioniert wenn man ein in einzene 
cpp/h-Dateien augfeteiltes projekt hat.

In meinem fall ist der Kunde eine spezielle Person und soll von ihr 
erben.

Ich denke so:
main.cpp
#include main.h

main.h
#include person.h

person.cpp
#include person.h

person.h
1
#ifndef Person_h
2
#define Person_h
3
4
#include "Kunde.h"
5
6
class Person
7
{
8
    protected:
9
        string name;
10
        string adresse;
11
    public:
12
        Person(string thename, string theaddresse);
13
        ~Person();
14
        string getName();
15
        string getAdresse();
16
        void setName(string thename);
17
        void setAdresse(string theadresse);
18
};
19
#endif

kunde.cpp
#include kunde.h

kunde.h
1
#ifndef Kunde_h
2
#define Kunde_h
3
4
#include <string>
5
using namespace std;
6
7
#include "Person.h"
8
9
class Kunde:public Person
10
{
11
    private:
12
        string ort;
13
        int kundennummer;
14
        bool leihgeb;
15
    public:
16
        Kunde(string thename, string theadresse, string theort,int thekundennummer, bool theleihgeb);
17
        ~Kunde();
18
        void setOrt(string theort);
19
        void setKundennummer(int kn);
20
        void setleihgeb(bool leih);
21
        string getOrt();
22
        int getKundennummer();
23
        bool getleihgeb();
24
};
25
#endif

Eventuell ist diese struktur falsch?

Ich bekomme folgende Fehler:
in der Person.h
Person.h:4,     from Person.cpp In file included from Person.cpp

in der Kunde.h
expected class-name before '{' token

Bin nun überfragt was der Grund sein könnte,
denn in dem einzigen ausprogrammierten Beispiel welches ich habe ist 
ausser dem :vererbende_klasse
nichts spezielles vorgesenen um erben zu können.
Jedoch ist dieses Beispiel in nur einer Datei realisiert.

grüße Matze

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Warum soll in "person.h" "kunde.h" eingebunden werden?

von Matze (Gast)


Lesenswert?

Wahrscheinlich ist das include von Kunde.h in Person.h nicht nötig, da 
es für die Person egal sein kann von wem sie genutzt wird.

In Kunde.h muss bekannt sein dass es die Person gibt, also muss sie dort 
eingebunden werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nochwas:

In kunde.h bindest Du string ein, aber in person.h nicht, obwohl Du dort 
auch strings verwendest.

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

Ja so wie es war wurde Kunde von Person includet.
Da sring in Kunde vorkam wurde er auch von Person übernommen.
Darin sehe ich kein Problem.

Hier mal das ganze Projekt.
Als Compiler verwende ich xwDevcpp

von Rolf Magnus (Gast)


Lesenswert?

Es ergibt wenig Sinn, in Person.h Kunde.h einzubinden, aber umgekehrt 
ist das nötig, denn wie soll Kunde von Person erben, wenn es diese 
Klasse nicht kennt?

Hier noch zwei kleine Tips zu deinem Code:
1
Kunde::Kunde(string thename, string theadresse, string theort,int thekundennummer, bool theleihgeb)
2
{
3
    ort=theort;
4
    kundennummer=thekundennummer;
5
    leihgeb=theleihgeb;
6
    Person(thename,theadresse);
7
}

Was soll die letzte Zeile bewirken? Sie erzeugt ein temporäres Objekt 
vom Typ Person, das danach sofort ungenutzt wieder zerstört wird. Tip: 
Schau dir mal an, was eine Initialisierungsliste ("initializer list") 
ist.
1
void setOrt(string theort)
2
{
3
    ort=theort;    
4
}

Wäre es nicht sinnvoller, wenn diese Funktion ein Klassenmember wäre?

von AVerr (Gast)


Lesenswert?

Wenn string in Kunde.h UND Person.h benutzt wird, includet man von 
beiden aus <string>.
In der Person.h die Kunde.h zu includen sorgt für eine Ringabhängigkeit 
( Kunde.h hängt von Person.h ab, die aber von Kunde.h ), welche 
letztendlich für den Fehler sorgt.

Korrekt wäre in dem Fall:

Person.h:
1
#ifndef __PERSON_H__
2
#define __PERSON_H__
3
4
#include <string>
5
6
class Person
7
{
8
...
9
}
10
11
#endif

Kunde.h:
1
#ifndef __KUNDE_H__
2
#define __KUNDE_H__
3
4
#include <string>
5
#include "Person.h"
6
7
class Kunde : public Person
8
{
9
...
10
}
11
12
#endif

von Matze (Gast)


Lesenswert?

Danke hab es hinbekommen,

grüße
Matze

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.