Const-Ausdruck statt #define in Klasse

Hallo allerseits,

Nach teilweiser Lektüre des Buches „Effective C++“ habe ich meine #defines in entsprechende const-Ausdrücke geändert und als static innerhalb einer Klasse definiert.

Mit int kein Problem, mit cstrings aber…

class Test{
public:
static int const ConstInt = 1; //Compiler: ok
static char const * const ConstCstring = „bla“;
// Compiler: Klassenelement kann hier nicht
// initialisiert werden
};

Als Workaround gibt es diese Möglichkeit:
class Test{
static char const * const ConstCstring;
};
char const * char Test::ConstCstring = „bla“;

Ich würde gerne die Zuweisung in der Klassendeklaration erledigen damit ich in der Headerdatei die Quasi-Defines habe(ob das unbedingt sein muss sei mal dahingestellt, ich halte es für übersichtlicher wenn solche Informationen im Header stehen).

Wie kann ich also „char const * const“ innerhalb einer Klasse als static deklarieren ohne auf die genannte Variante auszuweichen?

static int const ConstInt = 1; //Compiler: ok
static char const * const ConstCstring = „bla“;
// Compiler: Klassenelement kann hier nicht
// initialisiert werden

Mich wunderts, dass das bei einem int geht. Soweit ich weiß, kann man eine statische Variable in einer Klasse nicht bei der Deklaration initialisieren sondern muss eben dieses „Workaround“ verwenden

Ich würde gerne die Zuweisung in der Klassendeklaration
erledigen damit ich in der Headerdatei die Quasi-Defines
habe

Wiso willst du eigentlich konstante Variablen verwenden und keine #defines? Ich würde einfach alle Konstanten vor der Klasse definieren:

#define CONST\_INT 1
#define CONST\_CHAR "bla"

class Test
{
 ...
};

Wie kann ich also „char const * const“ innerhalb einer Klasse
als static deklarieren ohne auf die genannte Variante
auszuweichen?

Meines Wissens leider nicht möglich.

mfg dixxi

Wiso willst du eigentlich konstante Variablen verwenden und
keine #defines? Ich würde einfach alle Konstanten vor der
Klasse definieren:

Vielleicht wegen des wünschenswerten Scopings…?

Grüße,
Sebastian

Danke für eure Antworten!

Der aufs Nötige begrenzte Scope ist ein Grund.
Dazu kommen uneindeutige Typen durch #defines:

#define Int 0
#define String 0

class Test{
void Bla(int); // Variante A
void Bla(char*); // Variante B
};

//irgendwo im Code
Bla(Int); // Variante A
Bla(String); // Auch Variante A!

Habe inzwischen den Tipp bekommen, dass die Zuweisung in
der Klasse nur mit „statischen-integralen Konstanten“ funktioniert.
(auch wenn ich mich mal schlaumachen muss, was das umfasst - würde
aber vermuten die „natürlichen“ Typen wie int, double, char …)

Habe inzwischen den Tipp bekommen, dass die Zuweisung in
der Klasse nur mit „statischen-integralen Konstanten“
funktioniert.
(auch wenn ich mich mal schlaumachen muss, was das umfasst -
würde
aber vermuten die „natürlichen“ Typen wie int, double, char
…)

Ich glaube, mit „integral“ ist in dem Kontext ganzzahlig gemeint. Also nicht double/float. Seltsam, aber ich bin da auch schon mal drüber gestolpert und glaube mich zu erinnert, dass double nicht geht, int aber schon.

Viele Grüße,
Sebastian

Vielleicht wegen des wünschenswerten Scopings…?

Gut dann machs so:

static const int num = 0;

class Test
{
 ...
};

Dann ist num nur in der Datei verfügbar in der es deklariert wurde.

mfg dixxi

static const int num = 0;

class Test
{

};

Dann ist num nur in der Datei verfügbar in der es deklariert
wurde.

Wenn diese Klasse in einer h-Datei steht, die von anderen Dateien inkludiert wird, ist das nicht so (der „Dateiscope“ von C bezieht sich nämlich auf die Kompilierungseinheiten - die Auslagerung von Code in h-Dateien ist für den Compiler unsichtbar). Dank static gibt es zwar keinen Linkerfehler, aber es geschieht die gleiche Namespace-Verschmutzung auf Programmiersprachenebene wie mit einem define (der ja ebenfalls kompilierungseinheitslokal ist).

Viele Grüße,
Sebastian

Hallo Qwetchen

Ich mache das typisch so, gilt für den Scope des einen Moduls (weil anonymer namespace), ist typensicher und hat auch gleiche Werte für alle Instanzen:

namespace
{
 // sind alle de facto "static":
 int num = 123;
 bool onOff = 1;
 char alpha = 'A';
};

class X
{
};

int main()
{

}

Vielleicht hilft das.
lG
Martin B