Klassenbezogene Konstanten definieren?
-
Folgendes Problem: Ich würde ein Define/eine Konstante gerne bezogen auf eine Klasse bzw. ein Objekt definieren, so dass diese nur im Zusammenhang mit diesem Objekt bekannt ist.
Also z.B. so:
MyClass mC; mC.setMode(mC.MODE_A);
Es soll also MODE_A nur über MyClass oder wie oben über mC zugreifbar sein, womit ein simples #define also wegfällt. Mit einem
const int MODE_A=1;
im public-Teil des Headers funktioniert es schon mal nicht.
In Java geht sowas beispielsweise mit
static final int MODE_A=1;
Wie geht sowas in C++?
Elmi
-
struct die_klasse { static const int SIEBEN = 111; }; /* ... */ int main() { ::std::cout << die_klasse::SIEBEN; }
so, oder so ähnlich ging das...
-
Warum ist in dem Java-Beispiel die Konstante static und im C++-Code nicht?
-
So funktioniert es eben leider nicht.
Packe ich es in das Headerfile ausserhalb von "class":
error C2258: Ungueltige Syntax fuer rein virtuelle Methode; '= 0' erforderlich error C2252: 'SIEBEN' : Nur Funktionen koennen rein virtuell deklariert werden 'die_klasse' : 'struct'-Typ-Neudefinition
Packe ich es in das C-File oder im Headerfile in den class-Bereich:
error C2580: Neudefinition des Klassennamens 'die_klasse' Siehe Deklaration von 'die_klasse' error C2649: 'die_klasse' ist kein 'struct
-
@frosty: Das Beispiel ist rein willkürlich, mit dem static hat es genau so wenig geklappt - die Compilerfehlermeldungen sind die gleichen.
-
http://www.cpp-tutor.de/cpp/le10/le10_01.htm#parameter
http://www.cpp-tutor.de/cpp/le10/le10_04.htm#eigenschaften
-
Hallo,
so müsste es funktionieren:
//bla.h class bla { static const int i; }; ... //bla.cpp const bla::i = 1234;
-
*sich am Hinterkopf kratzt*
würde mal sagen die Variable in header deklarieren
static const int iValue;
und in der CPP-Datei dann definieren:
int Class::iValue = 2;
Wobei ich mir nicht mehr sicher bin, ob man im cpp das const nochmal hinschreiben muss aber das kannst du ja ausprobieren...
Ansonsten verwendest du bestimmt VC++ 6 Elmi, oder?
Der Compiler mag die Definition im Header nicht, obwohl dies eigentlich gültiger C++ Code ist.
-
maxpower1984 schrieb:
Hallo,
const bla::i = 1234;
Thx, das war der entscheidende Hinweis!
-
maxpower1984 schrieb:
//bla.h class bla { static const int i; }; //bla.cpp const bla::i = 1234;
Das hat den Nachteil, dass bla::i dann keine Compilezeit-Konstante ist und z.B. nicht als case-Label oder Arraydimension verwendet werden kann. Wenn man das will, dann geht -- allerdings nur mit integralen Typen (char, int, enum ...) -- nur die direkte Definition in der Klasse:
class Bla { static const int i = 1234; };
Bei Compilern, die das nicht schlucken (z.B. meines Wissens MSVC 6), funktioniert folgender Workaround ("enum-Hack"):
class Bla { enum { i = 1234; }; };
-
Andere Methode
Header:
class MyClass { // Einiges static int Constant_0 (void); static float Constant_1 (void); //Rest }
Body:
int MyClass::Constant_0 (void) { return 4711; } float MyClass::Constant_1 (void) { return 4711.4711; }