mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
class MainFrm : public wxFrame
{
...
}
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:
MainFrm* frame = NULL;

Damit in meiner Taskbaricon-Klasse der Zeiger bekannt ist, habe ich dies 
mittels:
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?

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

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

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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: daniel (Gast)
Datum:

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

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.