Vererben über verschiedene Header klappt nicht

Gast #1725663
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.