Initialisierung eines const - Arrays als Klassenmember

jokey2

Erfahrenes Mitglied
Ich würde gerne in einer Klasse ein konstantes Array von Strings als Member haben. Leider schaffe ich es nicht, dies zu initialisieren:
Code:
class KlasseA
{
    ...
    const char* numbers[] = {"null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun"};
    ....
}
So funktioniert es leider nicht! Kann mir jemand sagen, wie ich das machen kann?
Für hilfreiche Hinweise bin ich wie immer sehr dankbar.
 
Was bekommst du denn für einen Fehler?
Was ist wenn du die Arraygröße explizit festlegst?
Code:
 const char* numbers[10] = {...};
 
1. Die exakten Fehlermeldungen sind:
error C2059: Syntaxfehler : '{'
error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionsrumpf wird übersprungen
2. Das habe ich auch schon versucht, aber er stört sich an der Initialisierung innerhalb der Klassendefinition. Ich hab auch schon versucht, das Array dann im Konstruktor der enthaltenden Klasse zu initialisieren, aber das geht auch nicht, da es für Arrays keinen entsprechenden Kontruktor gibt. Also
.h
Code:
 class KlasseA
 {
     ...
     const char* numbers[];
     ....
 }
.cpp
Code:
KlasseA::KlasseA :
    numbers{"null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun"}
{
     }
funktioniert auch nicht.
 
Dann Versuch mal in deiner Klasse dein Array so zu initialisieren:
Code:
class KlasseA {
  ...
  static const char* numbers[10];
  ...
}

const char* KlasseA::numbers[10] = { "null", "eins", ".." };
 
Du definierst "const char* numbers[]" ohne Angabe einer Größe. Diese muß aber zum Compilezeitpunkt bekannt sein. Der ctor der Klasse ist dann beim Initialisieren des Objekts für die Initialisierung des Arrays zuständig. Das passiert aber erst zur Laufzeit.
Der Kompiler kann dieses Dilemma leider nicht auflösen, da er kein Hellseher ist. ;)

Code:
class KlasseA
{
public:
        // ctor
	KlasseA() 
	{
		numbers[0] = "null";
		numbers[1] = "eins";
		numbers[2] = "zwei";
		numbers[3] = "drei";
		numbers[4] = "vier";
		numbers[5] = "fünf";
		numbers[6] = "sechs";
		numbers[7] = "sieben";
		numbers[8] = "acht";
		numbers[9] = "neun";
	}

public:
        // Data Members
        const char* numbers[10]; 
};

So sollte der Code funktionieren. Trotzdem würde ich mir Gedanken machen, ob sich nicht der Einsatz einer StringArray-Klasse lohnen würde, hier könntest du auch mit Basisklasseninitialisierer/Elementinitialisierer arbeiten. Für Arrays primitiver Datentypen existiert soweit ich weiß keine explizite Elementinitialisierung in Klassen.
 
Zuletzt bearbeitet:
Das funktioniert nicht, weil man eine cost-Variable, also eine Konstante, nicht verändern kann.
Es sieht für mich so aus, daß ich in C++ keine konstanten Member-Arrays anlegen kann, da sie nicht initialisiert werden können.
 
Hallo,

was spricht gegen TwoFaze's Vorschlag deine Variable statisch zu deklarieren?

Da du dein Feld eh nicht veraendern kannst (da ja const) sollte das semantsich das gleiche sein
als wenn sie nicht statisch waere...

Gruß,

RedWing
 
jokey2 hat gesagt.:
Das funktioniert nicht, weil man eine cost-Variable, also eine Konstante, nicht verändern kann.
Es sieht für mich so aus, daß ich in C++ keine konstanten Member-Arrays anlegen kann, da sie nicht initialisiert werden können.

Das ist so nicht ganz richtig. Bei Zeigern sieht die Sache etwas komplexer aus.
Der Zeiger kann konstant sein, der Inhalt oder auch beides.

In Deinem Fall sind die Zeiger sind const, aber deren Inhalt nicht!
Demzufolge sollte der Code funktionieren. Hast Du das wirklich mal versucht?
Bei mir tut es mit VC6 und VC7 einwandfrei...

const char* numbers[10] --> definiert ein Array mit konstanten Zeigern
char* const numbers[10] --> definiert ein Array mit konst. Inhalt, aber die Zeiger sind nicht konstant
const char* const numbers[10] --> komplett konstantes Array (Zeiger UND Inhalt)
 
RedWing hat gesagt.:
Hallo,

was spricht gegen TwoFaze's Vorschlag deine Variable statisch zu deklarieren?

Da du dein Feld eh nicht veraendern kannst (da ja const) sollte das semantsich das gleiche sein
als wenn sie nicht statisch waere...

Gruß,

RedWing

static würde ich nur als "semantisch gleich" bezeichnen wenn Zeiger und Inhalt const sind.
Gerade in diesem Fall ist von static eher abzuraten, da so jedes Objekt seine Zeigerinhalte aktualisieren kann. Es wird lediglich vermieden das die Zeiger manipuliert werden können.

LG CF
 
Hallo,
CodeFlatter hat gesagt.:
Gerade in diesem Fall ist von static eher abzuraten, da so jedes Objekt seine Zeigerinhalte aktualisieren kann. Es wird lediglich vermieden das die Zeiger manipuliert werden können.

LG CF
wenn ich eine Variable also const char* definiere ist der Inhalt unveraenderlich aber die Zeiger koennen
veraendert werden, nicht umgedreht...
Wenn mans ganz sicher machen will dann macht man halt gleich alles beides const, auch da sehe ich
kein Problem drin, vorrausgesetzt es ist das was jokey2 haben will :):

Code:
class A{
    public:
        static const char* const sentence[];
};

const char* const A::sentence[] = {
    "Hallo", "so","gehts","und","die","Semantik","ist",
    "aquvialent","zu","einer","nichtstatischen","member","da","ich","ja","komplett", "const","bin"
};

Gruß,

RedWing
 
Zurück