Vererbung mit mehereren Dateien in cpp

Gast #3595488
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
Gast #3595549
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.
Gast #3595627
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?
Gast #3595631
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren