Vererben über verschiedene Header klappt nicht

Gast #1725663
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
Gast #1725708
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
#1725724
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.
Gast #1725752
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
Angehängte Dateien:
Gast #1725755
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

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