Seite 1 von 1

Definition globaler Variable löst C2143 aus

Verfasst: 20. Mai 2010 13:54
von stardust5383
Ich habe in einer global.h meine Globalen Variablen folgendermaßen deklariert:

Code: Alles auswählen

#pragma once

#ifdef MODUL0
#define EXTERN
#else
#define EXTERN extern
#endif

#include <QtGui/QApplication>
#include "modulmain.h"
#include "ModuleConfig.h"

EXTERN ModulMain *wMain;
EXTERN ModuleConfig *wMainConfig;
in der Mainmethode instanziere ich beide mit

Code: Alles auswählen

wMain = new ModulMain;
wMainConfig = new ModuleConfig("Test");
Beim Kompilieren erhalte ich nun die Meldung:
1>c:\projekte\moduler\global.h(14) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
1>c:\projekte\moduler\global.h(14) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\projekte\moduler\global.h(14) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Kommentiere ich

Code: Alles auswählen

EXTERN ModuleConfig *wMainConfig;
aus, funktioniert es einwandfrei.

Was mache ich hier falsch?

Verfasst: 20. Mai 2010 14:00
von kater
Versuch mal weg von globalen Variablen zu kommen.

Und du machst #define EXTERN. Und was ist EXTERN nun? Irgendwie garnichts. Und das gibt ein Fehler ;)

Verfasst: 20. Mai 2010 14:04
von stardust5383
Ich benötige die globale Variable um in allen Klassen Zugriff auf mein Hauptfenster zu erhalten. Da ich recht neu im Bereich C++ bin fehlt mir die Erfahrung. Immer das QWidget *parent durchreichen ist doch auch nicht sinnig oder?!

Das Beispiel mit #define EXTERN habe ich aus einem anderen Forum für die Deklaration externen Variablen. Der Fehler tritt ja auch nur bei dem zweiten Objekt auf. Wenn ich die Reihenfolge tausche rutscht der Fehler ja auch auf genau die besagte Zeile.

Verfasst: 20. Mai 2010 14:55
von franzf
Durchreichen ist in jedem Fall schöner, als mit extern zu arbeiten. Ich denke aber, du brauchst nichtmal das.
Schau dir SIGNAL/SLOT an. Deine Widgets und anderen Objekte werden ja wahrscheinlich direkt im MainWindow instantiiert. Wenn du eine Statusänderung an dein MainWindow melden willst, emittierst du ein entsprechendes SIGNAL. Das MainWindow macht beim Erstellen des Objektes, und connectet die möglichen SIGNALS auf entsprechende SLOTS.So können dann auch gleich andere interessierte Zuhörer Änderungen mitbekommen.

Verfasst: 20. Mai 2010 17:34
von RHBaum
Ich benötige die globale Variable um in allen Klassen Zugriff auf mein Hauptfenster zu erhalten.
ouch ouch ouch ....

DU baust klassen, die auf Fenster direkt zugreifen !?
Dann muessen die auch Ihr "fenster kennen" klar.

die Frage iss wo instanziierst du diese Klassen ? Global ?
oder in irgendeinem COntext ? Was ist der Context ? Sollte der Context nicht seine Widgets kennen, worauf er ausgaben erzeugt ?

also die Frage iss ...
Kannst du die Klassen so bauen, dass sie inner halb der widgets angelegt werden koennen ? dann kannst den Klassen doch easy das WIdget mitgeben.

Musst du aber die Klassen mit uanabhaengigen Lifecycle von den widgets erzeugen, solltest du tunlichst Fenster und Klasse(Logic Schicht in dem falle meist) trennen (Interfaces / genereischerer datenaustausch / Signale + Slots)!

Ciao ...