Hallo,
ich habe eine Basisklasse in einer eigenen Header:
1
classBewGewicht{
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
classRoboter:publicBewGewicht
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
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
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
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.
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
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
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.