Statische konstante Strings in Klassenheader
-
Hallo
Grundsätzlich ist das so im C++ Standard festgeschrieben, die Compilerhersteller dürften es also eigentlich auch nicht anders machen. Die genauen Hintergründe wirst du im C++ Forum eher erfahren.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Achja,
static const char* stringValue;
ist keine Konstante, es ist ein variabler Zeiger, über den man das, auf das er zeigt, nicht ändern kann.
-
OK, das
static const char* stringValue;
nicht statisch ist, ist klar. Aber warum kann man in einem Header in der Klassendeklaration nicht direkt statische konstante String festlegen.
Liegt es daran, dass Strings laut Standard immer als char* erstellt werden und somit nicht statisch sind? Ansonsten werden Strings ja immer durch Klassen gekapselt. Dabei handelt es sich dann immer um Objekte, die somit nicht statisch sind.
Oder gibt es dafür einen ganz anderen Grund?
-
DarkGuardian schrieb:
OK, das
static const char* stringValue;
nicht statisch ist, ist klar.
So klar scheint es nicht zu sein, wenn du statisch und konstant verwechselst. :p
DarkGuardian schrieb:
Aber warum kann man in einem Header in der Klassendeklaration nicht direkt statische konstante String festlegen.
Liegt es daran, dass Strings laut Standard immer als char* erstellt werden und somit nicht statisch sind? Ansonsten werden Strings ja immer durch Klassen gekapselt. Dabei handelt es sich dann immer um Objekte, die somit nicht statisch sind.
Oder gibt es dafür einen ganz anderen Grund?
Das hat nichts mit
char*
vs.std::string
zu tun, zumal ein statischeschar*
ja auch nicht im Header definiert werden kann.Für Definitionen von Funktionen und Variablen sind die CPP-Dateien vorgesehen. Dazu gehören statische und externe Variablen. Der Header dient nur als Schnittstelle, um mit der Deklaration den Namen bekannt zu machen.
Dass integrale Typen hier eine Ausnahme darstellen, hat verschiedene Gründe. Zum einen sind damit solche Dinge möglich:
class MyClass { static const int Size = 5; float Array[Size]; };
Zum anderen ist das sehr vorteilhaft in der Template-Metaprogrammierung, wenn man über Templateargumente Informationen während der Compilierzeit weiterreichen will.
-
Nexus schrieb:
Dass integrale Typen hier eine Ausnahme darstellen, hat verschiedene Gründe.
die fehlermeldung der gcc ist da nicht supi.
double ist nämlich nicht integral, klappt aber.
-
So klar scheint es nicht zu sein, wenn du statisch und konstant verwechselst. :p
OK, ich meinte konstant und habe mich in der Kürze der Zeit vertan. Aber inhaltlich ist mir schon klar, was der Unterschied ist.
Wenn ich dich recht verstehe, bilden nicht die Strings die Ausnahme sondern die integralen Typen. Denn nur diese können auch in der Headerdatei gefüllt werden. Von dieser Seite betrachtet ist es wieder einheitlich. Aber wie setzt man dann denn die Werte der static const Strings, die im Header deklariert wurden? Wird das einfach in der CPP außerhalb der Methoden gemacht?
-
Ja. Siehe auch Beitrag von akari.
-
Danke für den Hinweis. Beim Beispiel von akari sieht es aber eher danach aus, dass das in der Headerdatei passiert (und so habe ich es momentan auch umgesetzt. Aber das lässt sich ja schnell ändern.
-
DarkGuardian schrieb:
Danke für den Hinweis. Beim Beispiel von akari sieht es aber eher danach aus, dass das in der Headerdatei passiert (und so habe ich es momentan auch umgesetzt. Aber das lässt sich ja schnell ändern.
Prinzipiell "kennt" C++ ja auch gar keine "Header-Dateien", sondern nur ein "Zusammankleben verschiedener Dateien via #include" - deswegen ist es dem COmpiler erstmal egal, woher sein "Futter" stammt.
In der Praxis hat sich aber ein bestimmtes Vorgehen herauskristalliert und mit dem hättest Du schnell Probleme, wenn Du Variablen in der Headerdatei definierst, weil diese eigentlich dazu da sind, in mehreren Module inkludiert zu werden. und das führt zu Mehrfachdefinitionen führt ... (=> typischerweeise Linkerfehler).Ergo: NICHT im Header ist wesentlich besser.
Gruß,
Simon2.
-
DarkGuardian schrieb:
OK, ich meinte konstant und habe mich in der Kürze der Zeit vertan. Aber inhaltlich ist mir schon klar, was der Unterschied ist.
Das dachte ich mir, ich meinte es auch nicht allzu ernst (deshalb das Smiley).
DarkGuardian schrieb:
Wenn ich dich recht verstehe, bilden nicht die Strings die Ausnahme sondern die integralen Typen. Denn nur diese können auch in der Headerdatei gefüllt werden. Von dieser Seite betrachtet ist es wieder einheitlich. Aber wie setzt man dann denn die Werte der static const Strings, die im Header deklariert wurden? Wird das einfach in der CPP außerhalb der Methoden gemacht?
Grundsätzlich werden Variablen der Speicherklasse
static
undextern
in den Implementierungsdateien definiert. Das hat dann auch den Vorteil, dass man die Abhängigkeiten klein hält - bei einer Änderung des Wertes in der CPP-Datei müssen die Module, die den Header einbinden, nicht neu kompiliert werden.