Forum: PC-Programmierung C++ Fehler: expected init-declarator before '*' token


von Thomas (Gast)


Lesenswert?

Hi,
ich bin gerade dabei eine GUI mit wxWidgets zu schreiben.
Ich habe in der Datei MainFrm.h meine Klasse für das Hautpfenster:
1
class MainFrm : public wxFrame
2
{
3
...
4
}
Nun habe ich eine weitere Datei in der ich eine Klasse für ein 
Taskbar-Icon habe, mit dem die Hauptanwendung gesteuert werden kann.

Dazu lege ich mir einen Zeiger auf die MainFrm-Klasse an. Und zwar in 
der Datei  MainFrm.cpp als globale Variable mit:
1
MainFrm* frame = NULL;

Damit in meiner Taskbaricon-Klasse der Zeiger bekannt ist, habe ich dies 
mittels:
1
extern MainFrm* frame;
versucht, dabei bekomme ich beim Übersetzen (GCC) aber den Fehler:

> TaskbarIcon.h expected init-declarator before '*' token

Dies sagt mir aber überhaupt nichts. Den Header der MainFrm-Klasse habe 
ich includiert sodass die Klasse bekannt sei sollte.

Hat jemand einen Tip?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Prinzipiell sollte es so gehen. Häng doch mal die Dateien an oder zeig 
uns ein Minimalbeispiel mit dem Fehler. Vielleicht kommt der ja woanders 
her (bei google haben Leute mit dem Fehler auch öfters ein ; hinter 
class ..{} vergessen).

Die eleganteste Lösung wäre allerdings, deinem TaskbarIcon-Objekt den 
Pointer beim Erstellen zu übergeben (falls TaskbarIcon von einer 
wx-Klasse abgeleitet ist, übergibt du einen MainFrm* wahrscheinlich 
schon jetzt als parent)

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Vorher hatte ich alle Klassen zusammen in einer Datei, dann konnte ich 
es auch übersetzen.
Ein Semikolon fehlt auch an keiner Stelle, deswegen dachte ich dass 
meine extern Deklaration falsch ist.

Im Anhang mal ein Minimalbeispiel.

Den Pointer der Taskbar-Klasse zu übergeben ist auch eine gute Idee, 
besser als eine globale Variable.

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Du hast (böse) zirkuläre Abhängigkeiten in deinen Header-Dateien:

Du hast folgende Einbindungsreihenfolge:
- MainFrm.cpp (wird kompiliert)
- MainFrm.h
- TaskbarIcon.h (in Zeile 22 in MainFrm.h bevor class MainFrm 
deklariert wird!)
- MainFrm.h wird wegen den #define-Einträgen nicht nochmals eingebunden
-> in TaskbarIcon.h ist MainFrm noch garnicht bekannt.

Man sollte wenn möglich die Abhängigkeiten so gering wie nötig halten, 
d.h
- MainFrm.h nur forward declaration auf MyTaskbarIcon
- In MainFrm.cpp erst TaskbarIcon.h einbinden
- TaskbarIcon.h nur forward declaration auf MainFrm
- In TaskbarIcon.cpp erst MainFrm.h einbinden

Wobei ist überhaupt nicht von MyTaskbarIcon auf MainFrm zugreife würde, 
sondern die Kommunikation in diese Richtung über Events machen würde...

von Thomas (Gast)


Lesenswert?

Danke für die Erklärung!
Bei der Fehlermeldung muss man da auch erst mal drauf kommen. Mit 
forward Deklarationen habe ich bis jetzt noch nicht viel gemacht (mein 
C++-Buch schweigt sich darüber leider aus).

In meinem C-Programmen habe ich bis jetzt die Header-Dateien immer nur 
in der zugehörigen .h Datei eingebunden. Mit diesem Schema kommt man bei 
C++ wohl nicht weit.

Gruß

von daniel (Gast)


Lesenswert?

das Problem ist keinesweg c++ spezifisch
in beiden Fällen ist Präprozessor am Werk.
Ich hatte auch schon böse Fallen dieser Art erlebt,
wo man erstmal überzeugt ist, dass da kein Fehler ist.

Ich habe dieses Problem nicht analysiert,
ich denke aber generell kann man sagen, dass
wenn die includes-graph eine Art Baum ohne Zyklen darstellt
tauchen solche Probleme nicht auf.

grüsse,
    daniel

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.