Forum: PC-Programmierung Vererben über verschiedene Header klappt nicht


von Hans (Gast)


Lesenswert?

Hallo,

ich habe eine Basisklasse in einer eigenen Header:
1
class BewGewicht{
2
  protected:
3
    //...      
4
  public:
5
    //...    
6
};
Wenn ich jetzt in einer anderen Header eine neue Klasse Definiere und 
die BewGewicht vererbe:
1
#include "BewGewicht.h"
2
class Roboter: public BewGewicht
3
{
4
  private:
5
    //...
6
  public:
7
    //...
8
};
Dann bekomm ich für die Klasse Roboter folgenden Fehler:
expected class-name before ‘{’ token

Irgendwie erkennt also der Compiler BewGewicht nicht als Klasse an, 
obwohl es eingebunden ist!??
Weiss jemand wieso?

MFG Hans

von g457 (Gast)


Lesenswert?

Hier tut das. Teipo in den Dateinamen? Sonst zeig mal alles(!) her.

von Hans (Gast)


Angehängte Dateien:

Lesenswert?

Die Klassen Roboter und Spieler werden von BewGewicht abgeleitet, hier 
steht auch jeweils die Fehlermeldung.
In der Wippe gibt es eigentlich nur Zeiger auf die beiden Klassen, 
sollte hier also uninteressant sein...

MFG

von g457 (Gast)


Lesenswert?

nimm aus der BewGewicht.h in Zeile 6 das
   #include "Wippe.h"
raus:
1
In file included from Wippe.h:6,
2
                 from BewGewicht.h:6,
3
                 from Roboter.h:7,
4
                 from Roboter.cpp:1:
5
Spieler.h:19: error: expected class-name before ‘{’ token

Dafür hast Du ja schon die extra-Deklaration 'class Wippe;' drin in der 
BewGewicht.h.

Ohne klappts dann auch mit dem Nachbar^WCompilieren ;-) ..hoffentlich 
klappt das Linken dann auch..

HTH

von Hans (Gast)


Lesenswert?

Hallo,

dann bekomme ich aber in der BewGewicht.h für die Zeile
class Wippe;
einen Fehler. Die Klasse BewGewicht hat ja einen Pointer auf Wippe!

MFG

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:
> Hallo,
>
> dann bekomme ich aber in der BewGewicht.h für die Zeile
> class Wippe;
> einen Fehler.

nämlich welchen?

> Die Klasse BewGewicht hat ja einen Pointer auf Wippe!

Macht nichts.
Die Forward-Deklaration der Klasse Wippe reicht dafür aus.


Du hast 'kreisförmige' Includes. A includiert B welches wiederrum A 
includiert. So was ist immer schlecht.

Entweder du includierst das Header File, welches eine Klasse deklariert 
ODER du benutzt eine Forward-Deklaration. Forward-Dekl geht nur dann, 
wenn in der Klasse nur Pointer und Referenzen benutzt werden. Und ja. So 
eine Foward-Dekl. ist das Mittel um Kreisbezüge in den Include Files 
aufzubrechen.

Ach ja:
In der eigentlichen Verwendung, also in BewGewicht.cpp muss dann ein 
include für Wippe.h rein. Um mit dem Pointer zu arbeiten, muss dann die 
komplette Klassendeklaration vorhanden sein. Aber an den Stellen wo es 
nur darum geht, Speicher für einen Pointer zu reservieren reicht eine 
Forward-Dekl.

von g457 (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab die übrigen überflüssigen includes noch entsogt, und es geht 
hier immernoch, du hast also irgendwo noch einen weiteren Looping drin.

Ich habs Dir (mit ein paar pseudo-Implementierungen) mal 
zusammengepackt, damit man sieht, dass es 'geht'. Einfach die buildme.sh 
ausführen und feddisch (das ganze natürlich in einem extra 
Testverzeichnis!).

HTH

--
sieht dann etwa so aus:
1
$ rm -f *.o
2
$ cat buildme.sh 
3
#!/bin/bash
4
5
for f in Roboter Wippe Spieler BewGewicht ; do gcc -Wall -c "${f}.cpp" -o "${f}.o" ; done
6
$ ./buildme.sh 
7
$ file *o
8
BewGewicht.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
9
Roboter.o:    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
10
Spieler.o:    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
11
Wippe.o:      ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

von Hans (Gast)


Lesenswert?

Hallo,

danke - auf VC2005 lässt es sich kompilieren. Mit Eclipse und g++ noch 
nicht:

Bei "class Wippe{" wird folgendes als Fehler ausgegeben: candidates are: 
Wippe::Wippe(const Wippe&)

Bei "Wippe(float l, BewGewicht *r, BewGewicht *p);" in der Klasse Wippe 
wird folgendes als Fehler ausgegeben: Multiple markers at this line
                          - Wippe::Wippe(float, BewGewicht*,
                            BewGewicht*)

Interessant was es doch für (für mich) aussageleere Fehlermeldungen 
gibt!?

MFG

von Hans (Gast)


Lesenswert?

Ok - hat sich erledigt

Man sollte nicht mit 2 verschiedenen IDEs arbeiten und versuchen das 
gleiche zu programmieren;-)

Danke für eure Hilfe!

MFG

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.