Benutzen von "static const" Members in einer Switch anweisung....
-
Hi,
ich wollte gerade eigentlich nur ein Par Konstanten für eine Klasse definieren
und diese dann innerhalb einer Switch/case Anweisung abarbeiten. Bekomme jedoch
den fehler den ich aber nicht verstehe, weil die Variablen ja konstant sind?!? Oder wird der Speicher für Statische Member Konstante variablen dynamisch verwaltet?Wenn ich mir nen namespace anlege z.B. blub dann geht das. Was ich aber dann nicht so schön finde ist, dass die Konstanten einem Namespace und nicht meiner Klasse zugeordnet sind.
Hat jemand eine erklärung dafür?

Variante Namespace:
namespace blub{ static const unsigned int A=1; static const unsigned int B=2; }Variante Member variable:
Blub.h#ifndef BLUB_H_ #define BLUB_H_ class Blub { public: static const unsigned int A; static const unsigned int B; public: Blub(); virtual ~Blub(); }; #endif /*BLUB_H_*/Blub.cpp
#include "Blub.h" /*static*/ const unsigned int Blub::A=1; /*static*/ const unsigned int Blub::B=2; Blub::Blub() { } Blub::~Blub() { }main.cpp
#include <iostream> #include "Blub.h" using namespace std; int main() { unsigned int i = 2; switch(i) { case Blub::A: // aja a break; case Blub::B: // aja b break; default: // no static member.... } return 0; }**** Build of configuration Debug for project Test ****
make all
Building file: ../src/Blub.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Blub.d" -MT"src/Blub.d" -o"src/Blub.o" "../src/Blub.cpp"
Finished building: ../src/Blub.cppBuilding file: ../src/Test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Test.d" -MT"src/Test.d" -o"src/Test.o" "../src/Test.cpp"
../src/Test.cpp: In function »int main()«:
../src/Test.cpp:17: Fehler: »Blub::A« kann nicht in Konstanten-Ausdruck auftreten
../src/Test.cpp:20: Fehler: »Blub::B« kann nicht in Konstanten-Ausdruck auftreten
../src/Test.cpp:25: Fehler: expected primary-expression before »}« token
../src/Test.cpp:25: Fehler: expected `;' before »}« token
make: *** [src/Test.o] Fehler 1
-
Compilerversion? (g++ -v)
-
Da main.cpp nur Blup.h inkludiert, weiß es zwar das es sich um Konstanten handelt, kennt deren Werte aber nicht.
Ich vermute mal da liegt das Problem.
-
Nochmal EDIT (ich sollte mir angewöhnen, richtig zu lesen):
Im Namespace initialierst Du die Werte direkt. In der Klasse nicht. Warum?

-
Compiler: g++ (GCC) 4.2.3
LordJaxom : Gute frage ich dachte man macht das mit statischen variablen so?!? Habs aber gerade getestet und siehe da es funzt auch so.
Jetzt stelle ich mir die frage warum ich das nicht immer so gemacht habe?!? Gibt es da nen Grund warum man es generell noch in der *cpp datei initialieren sollte?vorerst schonmal danke!
-
clemix schrieb:
LordJaxom : Gute frage ich dachte man macht das mit statischen variablen so?!? Habs aber gerade getestet und siehe da es funzt auch so.
Jetzt stelle ich mir die frage warum ich das nicht immer so gemacht habe?!? Gibt es da nen Grund warum man es generell noch in der *cpp datei initialieren sollte?Wenn Du statische integrale Konstanten in Klassen oder auf Namespaceebene (wie in Deinem funktionierenden Beispiel) definierst und initialisierst, werden sie als Compilezeit-Konstanten gehandelt. Sprich, sie werden während der Compilierung bereits durch ihre Werte ersetzt. Dann darfst Du sie auch in Switches benutzen.
Eine solche Konstante in der Klasse zu initialisieren bedeutet aber auch, dass Du sie in der .cpp-Datei nicht nochmals initialisieren solltest (darfst?). Ich glaube moderne Compiler warnen in diesem Fall sogar. Du musst sie in der .cpp-Datei sogar nichtmals mehr definieren, es seidenn Du brauchst irgendwo einmal die Adresse dieser Variablen (&Blub::A).
Warum Du das nicht immer so gemacht hast? Der Grund könnte sein, dass ältere Compiler dieses Sprachfeature garnicht oder nicht korrekt unterstützt haben. Ich hoffe aber, dass die Zeiten dieser Compiler vorbei sind
