Einfache Frage: const in class Definition
-
Hallo NG,
ich möchte mir ein paar constanten definieren. Dazu würde ich in xyz.h gerne folgendes schreiben.
class Xyz{ public: virtual int doSomething() = 0; blah blah... .... private: const int VALUE = 0; };Der Compiler quittiert mir aber solche Versuche mit der Meldung:
ISO C++ forbids initialization of member ‘CLOSED’class Xyz{ public: virtual int doSomething() = 0; blah blah... .... private: const int VALUE; };quittiert er logischerweise mit uninitialized member ‘NetworkClientImpState::CLOSED’ with ‘const’ type ‘const int’
Grüße,
M. Incani
-
class A { private: static const long VALUE = 7; };
-
Danke das funktioniert. Aber warum muß das static sein?
Gruß,
M. Incani
-
BlackPepper schrieb:
Danke das funktioniert. Aber warum muß das static sein?
Die Zuweisung ist nur bei klassenbezogenen Konstanten auf diese weise möglich. Instanzbezogen initialisierst du in der Initialisierungsliste des Konstruktors.
Beide Fälle im Beispiel:
class A { private: static const long constA = 4; // Sichtbarkeit: Klasse const long constB; // Sichtbarkeit: Instanz public: A() : constB(4) {} };
-
--- schon korrigiert von asc ---
-
Warum es C++ verbietet weiss ich nicht, d.h. ich bin mir nicht sicher.
Ich gehe aber davon aus dass es verboten ist weil es keinen Sinn macht.
Wenn nämlich der Wert einer Konstante für alle Instanzen einer Klasse gleich ist, dann ist das logisch betrachtet kein Member (=eins pro Instanz) sondern ein static Member (=eins für alle Instanzen).Und da man nur Konstanten auf diese Art und Weise initialisieren kann deren Wert für alle Instanzen gleich ist (und die daher static sein sollten) ... macht es auch wenig Sinn diese Art der Initialisierung für nicht-static Konstanten zu erlauben.
-
Danke für Deine Erklärung. Das ist sehr einleutend. Man lernt ja nie aus.

Gruß,
M. Incanihustbaer schrieb:
Warum es C++ verbietet weiss ich nicht, d.h. ich bin mir nicht sicher.
Ich gehe aber davon aus dass es verboten ist weil es keinen Sinn macht.
Wenn nämlich der Wert einer Konstante für alle Instanzen einer Klasse gleich ist, dann ist das logisch betrachtet kein Member (=eins pro Instanz) sondern ein static Member (=eins für alle Instanzen).Und da man nur Konstanten auf diese Art und Weise initialisieren kann deren Wert für alle Instanzen gleich ist (und die daher static sein sollten) ... macht es auch wenig Sinn diese Art der Initialisierung für nicht-static Konstanten zu erlauben.