übergabe einer globalen variable an eine klasse
-
HI.
Ich habe eine Frage. Und zwar sieht mein Programm im Moment so aus:
Source-Datei:#include <iostream> using namespace std; #define VARIABLE 768 #include "cCluster.h" int main() { cout << "HALLO\n"; return 0; }Und cCluster.h:
#pragma once #ifndef CCLUSTER_H #define CCLUSTER_H #include <iostream> class cCluster { public: cCluster(void); ~cCluster(void); void SetRGB () { std::cout << VARIABLE; } }; #endifNun erkennt der Comiler VARIABLE nicht in der Klasse cCluster. Auch wenn ich die Funktion SetRGB in die zugehörige .cpp schreibe, erkennt er sie nicht. Wie muss ich also VARIABLE definieren, so dass sie von der Klasse erkannt wird? Weil so wie es aussieht, nütze die einmalige Definition in der .cpp Datei ja nichts.
DANKE.
H.W.
-
Hi!
Woran erkennst du denn, dass das #define nicht erkannt wird? Du rufst SetRGB ja niemals auf. Im Übrigen ist sie schon etwas peinlich, diese Namensgebung!

-
Ich erkenne das daran, dass mir mein Compiler einen Fehler ausspuckt.
error C2065: 'VARIABLE' : undeclared identifier
Was gefällt dir denn an meiner Namensgebung nicht?
DANKE.
H.W.
-
Das deine vermeindliche Variable nicht variabel ist?!?
-
Hast du den Header eventuell woanders noch eingebunden? Dann könnte es sein, daß der Compiler dein #define nie sieht.
Eine Lösung wäre es, das #define in den Header zu packen. Zur Not könntest du es in einen #ifndef-Block einschließen, um dem Anwender die Möglichkeit zu geben, die Default-Definition zu überschreiben.
-
Hans Wurst schrieb:
Nun erkennt der Comiler VARIABLE nicht in der Klasse cCluster.
Wie sollte er auch? Mit #define legst du keine globale Variable an, sondern startest eine Textersetzung, die bei dieser Direktive beginnt und bis zum Ende der Datei geht. Da diese Direktive in deiner main-Datei steht, kann in cCluster.h nichts ersetzt werden.
Weil so wie es aussieht, nütze die einmalige Definition in der .cpp Datei ja nichts.
Wie gesagt, du definierst keine Variable.
-
Okay. Danke für die Beiträge. Wenn ich aber nun anstelle von #define folgende Zeile setze:
int DIM = 768;Dann habe ich meines Erachtens wieder 2 Probleme.
1.) DIM scheint auch nur innerhalb der main-Datei gültig zu sein. Muss ich daher eine extra Datei anlegen, in der ich meine globalen Variablen definiere?
2.) Man kann diese Variable nun ändern, was ich nicht will. Aber das könnte man ja dann so machen, oder?const int DIM = 768;DANKE.
H.W.
-
Hans Wurst schrieb:
1.) DIM scheint auch nur innerhalb der main-Datei gültig zu sein.
Gültig ist sie im ganzen Programm, aber sichtbar ist sie nur in der main-Datei.
Muss ich daher eine extra Datei anlegen, in der ich meine globalen Variablen definiere?
Nein. Du musst die Variable nur an einer leicht zugänglichen Stelle deklarieren, z.B. in cCluster.h:
extern const int DIM;
-
Entschuldigung, aber das Problem macht mir etwas zu schaffen:( Weil nun sieht mein Code wie folgt aus:
.cpp:#include <iostream> #include "cTest.h" int main() { return 0; }.h:
extern const int DIM; #pragma once class cTest { public: cTest(void); ~cTest(void); void SetDat() { } private: int itsDat; };Sobald ich aber jetzt irgendwo (also in die main-Funktion oder eine Funktion in cTest) DIM = 768 o.ä. schreibe, dann gibts den Fehler:
error C3892: 'DIM' : you cannot assign to a variable that is const
-
Wo hast du denn die Definition gelassen? Du kannst DIM nichts zuweisen, DIM ist const. Aber du kannst DIM initialisieren, bei der Definition. Die hast du aber offenbar entfernt.
-
Genau das ist der Sinn von 'const' - du darfst der Variable nichts zuweisen. Aber da du sowieso noch eine Definition der Konstanten benötigst (das 'extern' dort oben ist nur eine Deklaration), kannst du sie dort initialisieren:
//z.B. in der main.cpp oder der cTest.cpp: const int DIM = 4711;(wichtig ist, daß diese Definition nur einmal in deinem Projekt vorkommt)
-
Vielen Dank euch beiden! Es sieht aus, als würde es jetzt klappen

Und nehmen wir jetzt mal an, ich würde in ein paar weiteren Dateien einige Funktionen implementieren, die ich dann in main.cpp aufrufe. Die Headerdatei mit den Funktionsdeklarationen muss dann die Inkludeanweisung für die Headerdatei aufweisen, in der das
extern const int DIM;steht, oder?
H.W.
-
Nur wenn du in den Deklarationen DIM benötigst (oder andere Deklarationen des Headers).
(aber in den meisten Fällen dürfte es ausreichen, deinen Header in der zugehörigen Implementationsdatei einzubinden)