2008-11-12 20 views
21

Esto está relacionado con algunas otras preguntas, tales como: this, y algunas de mis otras preguntas.¿Cómo declaras las matrices en un encabezado C++?

En this question, y otros, vemos podemos declarar e inicializar las matrices de cadenas en un buen paso, por ejemplo:

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

Esto se puede hacer en la ejecución de una función con ninguna molestia, o en el cuerpo de un archivo .cpp, fuera de cualquier ámbito.

Lo que quiero hacer es tener un conjunto como éste, ya como miembro de una clase que estoy usando, algo como esto:

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 
    } 

}; 

embargo, el compilador se queja y me parece que no puede trabajar por qué. ¿Es posible declarar e inicializar una matriz como esta en un paso en una definición de clase? ¿Hay alternativas que sean mejores?

Estoy seguro de que este es un error muy amateur, pero como siempre, su ayuda y consejos son muy apreciados.

Cheers,

xan

+0

"implimentation" debe escribirse "aplicación" –

Respuesta

18

Usar la inicialización estática y externa palabra clave para realizar la matriz un miembro estático de la clase:

En el archivo de cabecera:

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 
    } 

}; 

En el.cpp:

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

Debe darle a la matriz un tamaño en la declaración del encabezado. – mbyrne215

+0

¿Estás seguro? Funciona bien para mí (Visual C++ 2005) y lo he estado usando varias veces. A menos que sea un comportamiento indefinido en el estándar (que no buscaré ahora), creo que funcionará. –

+0

Usted está bien mientras usa el inicializador. El compilador calculará el tamaño según la cantidad de elementos en el inicializador. –

3

Esto no es posible en C++. No puede inicializar directamente la matriz. En su lugar hay que darle el tamaño que tendrá (4 en su caso), y hay que inicializar la matriz en el constructor de DataProvider:

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); 
    } 
}; 

Tenga en cuenta que usted tiene que renunciar a la const-dad de los punteros en la matriz, ya que no puede inicializar directamente la matriz. Pero necesita configurar los punteros a los valores correctos y, por lo tanto, los punteros deben ser modificables.

Si los valores de la matriz son const sin embargo, la única manera es utilizar una matriz estática:

/* 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" }; 

Tener la matriz estática significa que todos los objetos compartirán esa matriz. Por lo tanto, también habrá guardado la memoria.

+1

_ "Tener la matriz estática significa que todos los objetos compartirán esa matriz" _ que también significa que usted ha probablemente sólo en peligro los principios fundamentales de la programación orientada a objetos . –

3

La razón por la que no se puede declarar la matriz como que (const char * []) ​​es que:

  • no se puede tener inicializadores en la declaración de clase, y así
  • la sintaxis const char* [] no indica la cantidad de espacio que el compilador necesita asignar para cada instancia (su matriz se declara como variable de instancia).

Además, es probable que desee hacer que la matriz sea estática, ya que, en esencia, es un valor constante.

+0

En realidad, 'const char * []' _does_ indica la cantidad de espacio que el compilador necesita asignar para cada instancia, solo un puntero a la memoria. Esto es realmente _por qué_ la declaración de matriz estática no está permitida para variables no estáticas; cada instancia nueva requiere asignación de memoria adicional, y ese tipo de sobrecarga de procesamiento tradicionalmente se maneja de forma explícita en los constructores. – meustrus

Cuestiones relacionadas