2008-11-12 6 views
21

Dies ist auf einige andere Fragen im Zusammenhang, wie zum Beispiel: this, und einige meiner anderen Fragen.Wie deklarieren Sie Arrays in einem C++ - Header?

In this question und andere, sehen wir, dass wir können String-Arrays in einem netten Schritt, zum Beispiel erklären und initialisieren:

const char* const list[] = {"zip", "zam", "bam"}; //from other question 

Dies kann in der Implementierung einer Funktion erfolgen ohne Mühe, oder in Der Hauptteil einer CPP-Datei, außerhalb des Bereichs.

Was ich tun möchte, ist ein Array wie folgt wie als Mitglied einer Klasse zu haben, ich bin mit, etwa so:

class DataProvider : public SomethingElse 
{ 
    const char* const mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    char* GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

Aber der Compiler beschwert und ich kann nicht zu funktionieren scheint Warum? Ist es möglich, ein solches Array in einem Schritt in einer Klassendefinition zu deklarieren und zu initialisieren? Gibt es Alternativen, die besser sind?

Ich bin sicher, dass dies ein sehr Amateur-Fehler ist, aber wie immer, Ihre Hilfe und Beratung wird sehr geschätzt.

Cheers,

xan

+0

„implimentation“ sollte –

Antwort

18

Benutze das Stichwort statische und externe Initialisierung das Array ein statisches Element der Klasse zu machen:

In der Header-Datei:

class DataProvider : public SomethingElse 
{ 
    static const char* const mStringData[]; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    const char* const GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

In der.CPP-Datei:

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 
+0

Sie müssen dem Array eine Größe in der Header-Deklaration geben. – mbyrne215

+0

Sind Sie sicher? Es funktioniert gut für mich (Visual C++ 2005) und ich habe es schon ein paar Mal verwendet. Es sei denn, es ist undefiniertes Verhalten im Standard (was ich jetzt nicht nachschlagen werde), ich glaube, es wird funktionieren. –

+0

Sie können den Initialisierer verwenden. Der Compiler berechnet die Größe basierend auf der Anzahl der Elemente im Initialisierer. –

3

Das in C++ nicht möglich ist. Sie können das Array nicht direkt initialisieren. Stattdessen haben Sie es, die Größe zu geben, wird es (4 in diesem Fall), und Sie müssen das Array im Konstruktor von DataProvider- initialisieren:

class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    const char * values[SIZEOF_VALUES]; 

    public: 
    DataProvider() { 
     const char * const v[SIZEOF_VALUES] = { 
      "one", "two", "three", "four" 
     }; 
     std::copy(v, v + SIZEOF_VALUES, values); 
    } 
}; 

Beachten Sie, dass Sie auf dem const-ness aufgeben müssen der Zeiger im Array, da Sie das Array nicht direkt initialisieren können. Aber Sie müssen später die Zeiger auf die richtigen Werte setzen, und daher müssen die Zeiger änderbar sein.

Wenn Ihre Werte im Array sind const doch der einzige Weg ist, ein statisches Array zu verwenden:

/* in the header file */ 
class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    static const char * const values[SIZEOF_VALUES]; 
}; 

/* in cpp file: */ 

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" }; 

die statische Array zu haben bedeutet, alle Objekte wird dieses Array teilen. So haben Sie auch Speicher gespart.

+1

_ Dinkel „Umsetzung“ werden „mit dem statischen Array bedeutet, dass alle Objekte dieses Array teilen“ _ was auch bedeutet, haben Sie wahrscheinlich nur die grundlegenden Prinzipien der objektorientierten Programmierung kompromittiert . –

3

Der Grund können Sie Ihre Array wie das (const char * []) ​​ist nicht erklären, dass:

  • Sie nicht initializers in der Klassendeklaration haben kann, und so
  • die Syntax const char* [] gibt nicht an, wie viel Speicherplatz der Compiler für jede Instanz reservieren muss (Ihr Array wird als Instanzvariable deklariert).

Außerdem möchten Sie wahrscheinlich das Array statisch machen, da es im Wesentlichen ein konstanter Wert ist.

+0

Tatsächlich gibt 'const char * []' _does_ an, wie viel Speicherplatz der Compiler für jede Instanz reservieren muss - nur ein Zeiger auf den Speicher. Dies ist wirklich _why_ statische Array-Deklaration ist nicht für nicht statische Variablen zulässig; Jede neue Instanz benötigt zusätzliche Speicherzuweisung, und diese Art von Verarbeitungsaufwand wird traditionell explizit in Konstruktoren behandelt. – meustrus