Nutzung von Konstanten in Klassen
-
Hallo zusammen, ich kann einfach keine Lösung für das folgende Problem finden, obwohl ich das dumpfe Gefühl habe, ich sitze direkt davor. Gewissermaßen wie die Schlange vor dem Kaninchen - oder umgekehrt?
Ganz simpel:
Ich möchte gerne eine Konstante definieren, innerhalb einer Klasse:A.h:
class A { public: static const char *CDE; }; const char *CDE = "abc";
Später möchte ich natürlich darauf zugreifen, etwas in der Art:
... x.append( A::CDE );
Nu bekomme ich die Meldung "A.obj : error LNK2005: "public: static char const * const A::CDE" (?CDE@A@@2PBDB) bereits in A.obj definiert"??? Alles probieren hat noch nix gebracht...
Der Versuch Definition und Initialisierung zusammen zu legen:
A.h
class A { public: static const char *CDE = "abc"; };
löst "e:\cvssource\elw\sept\sept exe\A.h(x) : error C2258: Ungueltige Syntax fuer rein virtuelle Methode; '= 0' erforderlich" und "e:\cvssource\elw\sept\sept exe\A.h(x) : error C2252: 'CDE' : Nur Funktionen koennen rein virtuell deklariert werden" aus... Zumal ich weiß, dass das nicht der richtige Ansatz ist... Just trying...
Ihr habt bestimmt 'ne schnelle Idee für mich, oder?
Danke schonmal,
Stephan
-
Müsste es nicht
const char* A::CDE = "abc";
heißen?
-
Ich weiß nicht, müsste es? Aber da es Konstanten sind, kann ich sie eh nicht mehr verändern. Und da die Daten für alle Instanzen der Klasse gleich sind, sollten sie m.E. am Besten an die Klasse und eben nicht an die Instanz gebunden sein. Ich denke, dafür ist static korrekt???
-
Ja das static ist korrekt ich meinte ne andere Stelle. So funktionierts:
class A { public: static const char *CDE; }; const char *A::CDE = "abc"; int main() { std::cout << A::CDE << '\n'; }
-
class A { public: static const char *CDE; }; const char* A::CDE = "abc";
Ist korrekt.
CDE ist statisch d.h. an kein Objekt gebunden.
Das erste ist die Deklaration (du sagst dem Compiler A hat einen Member CDE mit diesen Eigenschaften). Das zweite ist die Definition (hier legst du den "Inhalt" fest).const char* CDE = "abc";
Ist einfach eine neue Konstante mit dem Namen CDE.
-
Nur Ganzzahl-Konstanten können mit der Syntax
class A { static const int X = 42; };
direkt definiert werden.
Alle anderen Konstanten mußt du in der Header-Datei deklarieren und in genau einer Source-Datei (sogenannte ODR - One Definition Rule) definieren:
// in Header class A { static const char *CDE; }; // in Source const char * A::CDE = "abc"; // static darf nicht wiederholt werden!!!
-
Ok, sorry, das A:: hatte ich bloss vergessen, es war aber da, funktionierte jedoch trotzdem nicht. Der Grund dafür: Ich habe die Initialisierung const char *A::CDE="abc"; entweder in der Header Datei oder im Konstruktor gehabt. Beides gibt die oben aufgelisteten Fehlermeldungen.
Was allerdings geht: Wenn die Initialisierung in der A.cpp im Rumpf, außerhalb jeder Funktion/Methode steht, so geht es, danke dafür !!!
Eine letzte Frage: Diese Daten ausserhalb des Konstruktors zu definieren finde ich unschön. Was ist die gängige Praxis für solche Konstanten? Gibt es doch noch eine Möglichkeit, die Initialisierung in den Konstruktor / Methode zu verlagern?
Stephan
-
Nein, denn wenn die Variable statisch ist, ist sie nun mal unabhängig von einer Instanz, d.h. der Speicher wird dafür auch belegt, wenn keine Funktion darauf zugreift (wie eine globale Variable).
Du könntest alternativ mit Namespaces arbeiten:
// in Header namespace X { extern const char *CDE; // extern statt static!!! } // in Source namespace X { const char * CDE = "abc"; }