# Initialisierung eines const - Arrays als Klassenmember



## jokey2 (8. Juni 2006)

Ich würde gerne in einer Klasse ein konstantes Array von Strings als Member haben. Leider schaffe ich es nicht, dies zu initialisieren:

```
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.


----------



## TwoFaze (8. Juni 2006)

Was bekommst du denn für einen Fehler?
Was ist wenn du die Arraygröße explizit festlegst?

```
const char* numbers[10] = {...};
```


----------



## jokey2 (8. Juni 2006)

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

```
class KlasseA
 {
     ...
     const char* numbers[];
     ....
 }
```
 .cpp

```
KlasseA::KlasseA :
    numbers{"null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun"}
{
     }
```
funktioniert auch nicht.


----------



## TwoFaze (8. Juni 2006)

Dann Versuch mal in deiner Klasse dein Array so zu initialisieren:

```
class KlasseA {
  ...
  static const char* numbers[10];
  ...
}

const char* KlasseA::numbers[10] = { "null", "eins", ".." };
```


----------



## CodeFlatter (8. Juni 2006)

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.  


```
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.


----------



## jokey2 (8. Juni 2006)

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.


----------



## RedWing (8. Juni 2006)

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


----------



## CodeFlatter (8. Juni 2006)

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)


----------



## CodeFlatter (8. Juni 2006)

RedWing hat gesagt.:
			
		

> Hallo,
> 
> was spricht gegen TwoFaze's Vorschlag deine Variable statisch zu deklarieren?
> 
> ...



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


----------



## RedWing (8. Juni 2006)

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 :


```
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


----------



## CodeFlatter (8. Juni 2006)

Stimmt, im ersten Fall hab ich was verdreht :suspekt:.

Dennoch ist erst "static const char* const numbers[10]" semantisch gleichwertig.
Für "static const char* numbers[10]" gilt das nicht ...

Trotz allem sollte es auch mit dem Code von mir funktionieren, kommt eben drauf an was er haben will...

LG CF


----------



## RedWing (8. Juni 2006)

Hallo,

btw deine Variante funktioniert natuerlich auch 

//edit:


> Dennoch ist erst "static const char* const numbers[10]" semantisch gleichwertig.
> Für "static const char* numbers[10]" gilt das nicht ...



Natuerlich, war ein Irrtum meinerseits 

Gruß,

RedWing


----------



## jokey2 (8. Juni 2006)

Danke für die vielen Vorschläge. Ich werde sie testen, wenn ich wieder Zeit habe.
In der Tat ist es so, daß ich ein völlig unveränderliches Array haben möchte, also:

```
const char* const numbers[];
```


----------

