Forum: PC-Programmierung Probleme mit Vererbung


von BasisLer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

habe die Dateien im Anhang mit Visualc++ 2008 kompiliert, um eine 
einfache Vererbung von Klassen auszuprobieren.
Hierbei habe ich die Klassen-Deklarationen in eigene Header-Dateien 
gepackt.
Die Klasse "CMinenleger" soll eine abgeleitete Klasse der Basisklasse 
"CRaumschiff" sein.
Wenn ich das Projekt kompiliere, erhalte ich folgende Fehlermeldungen:

1>Kompilieren...
1>CMinenleger.cpp
1>d:\sonstiges\programmierung\c++_spieleprogrammierer\listing_7.11\craum 
schiff.hpp(4)  : error C2011: 'CRaumschiff': 'class' Typneudefinition
1> 
d:\sonstiges\programmierung\c++_spieleprogrammierer\listing_7.11\craumsc 
hiff.hpp(4):  Siehe Deklaration von 'CRaumschiff'
1>d:\sonstiges\programmierung\c++_spieleprogrammierer\listing_7.11\cmine 
nleger.hpp(6)  : error C2504: 'CRaumschiff': Basisklasse undefiniert


Was mache ich falsch?

Viele Grüsse, BasisLer

von Peter II (Gast)


Lesenswert?

BasisLer schrieb:
> Was mache ich falsch?

du musst dafür sorgen das header dateien sich mehrfach includieren 
lassen..


#ifndef __NAME_DER_DATEI
#define __NAME_DER_DATEI

class CRaumschiff
{
[...}
};

#endif

von Karl H. (kbuchegg)


Lesenswert?

Du hast in craumschiff.hpp keine Include Guards benutzt. Dadurch wird 
der Inhalt in CMinenLeger.cpp 2 mal inkludiert (einmal weil 
CMinenLeger.cpp selber den Inlucde macht und das zweite mal weil über 
CMinenleger.hpp noch ein Include erfolgt)

1
#ifndef RAUMSCHIFF_HPP_INCLUDED
2
#define RAUMSCHIFF_HPP_INCLUDED
3
4
// Basisklasse Deklaration
5
6
class CRaumschiff
7
{
8
protected:
9
  int m_Farbe;
10
  int m_Energie;
11
12
public:
13
  CRaumschiff ();
14
  ~CRaumschiff ();
15
  void Starten ();
16
  void Landen ();
17
};
18
19
#endif

Gewöhn dir an, in Header Files grundsätzlich einen Include-Guard zu 
setzen, denn sowas wird dir noch öfter passieren.

von BasisLer (Gast)


Lesenswert?

Vielen Dank für die Erklärung!

BasisLer

von Karl H. (kbuchegg)


Lesenswert?

Alternativ könntest du natürlich auch zum Schluss kommen, dich zu fragen 
was denn hier
1
// Abgeleitete Klasse Definition
2
3
#include <iostream>
4
#include "CRaumschiff.hpp"
5
#include "CMinenleger.hpp"
6
7
using namespace std;
8
9
// Konstruktor
10
CMinenleger::CMinenleger ()
11
{
12
  m_Minen = 10;
13
  cout << "Neuer Minenleger erstellt" << endl;
14
15
}
16
17
18
// Destruktor
19
CMinenleger::~CMinenleger ()
20
{
21
  cout << "Minenleger zerlegt" << endl;
22
}
23
24
25
CMinenleger::void Mine_Legen ()
26
{
27
  m_Minen--;
28
  cout << "Mine gelegt. Es sind noch " << m_Minen;
29
  cout << "Minen uebrig." << endl;
30
}

den Include von "CRaumschiff.hpp" erzwingt. Und die Antwort drauf ist: 
Nichts. In diesem Code gibt es keinen Grund, warum dieser Include 
notwendig sein sollte und daher fliegt der da raus.

(Das ist generell eine gute Idee, keine unnötigen Includes zu machen. Du 
erzeugst damit eine künstliche, unnötige Abhängigkeit zwischen 2 Files, 
die bei großen Projekten Kreise ziehen kann und den Vorteil des 'nur das 
Notwendige bei einer Änderung kompilieren' zunichte macht. In deinem 
Fall spielt das natürlich jetzt keine große Rolle und wirkt sich nur in 
einer Fehlermeldung aus, da über die Header Files ja sowieso eine 
Abhängigkeit besteht. Das sollte aber auch kein Freibrief sein, da 
nachlässig zu sein)

von BasisLer (Gast)


Lesenswert?

Ja, das sehe ich ein. Nochmals vielen Dank.

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.