mikrocontroller.net

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


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Basisklasse in einer eigenen Header:
class BewGewicht{
  protected:
    //...      
  public:
    //...    
};
Wenn ich jetzt in einer anderen Header eine neue Klasse Definiere und 
die BewGewicht vererbe:
#include "BewGewicht.h"
class Roboter: public BewGewicht
{
  private:
    //...
  public:
    //...
};
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

Autor: g457 (Gast)
Datum:

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

Autor: Hans (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm aus der BewGewicht.h in Zeile 6 das
   #include "Wippe.h"
raus:
In file included from Wippe.h:6,
                 from BewGewicht.h:6,
                 from Roboter.h:7,
                 from Roboter.cpp:1:
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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: g457 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
$ rm -f *.o
$ cat buildme.sh 
#!/bin/bash

for f in Roboter Wippe Spieler BewGewicht ; do gcc -Wall -c "${f}.cpp" -o "${f}.o" ; done
$ ./buildme.sh 
$ file *o
BewGewicht.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Roboter.o:    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Spieler.o:    ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Wippe.o:      ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.