2010-02-02 15 views
10

Soy estudiante de programación en mi primera clase de C++, y por un proyecto reciente que hice, he podido crear una matriz de cadenas que podía hacer en C#:¿C++ admite matrices constantes de tipo cadena?

string MONTHS[ARRAY_CAPACITY] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; 
// this yields many compiler errors in C++ 

¿Es posible hacer algo similar en C++?

Gracias!

+0

lo que es ARRAY_CAPACITY? Cómo se declara ¿Qué errores (generalmente es bueno decir)? ¿Realmente quieres una matriz de 'string' (objeto), frente a una matriz de c-string (array of char)? – Romain

+0

'#DEFINE ARRAY_CAPACITY 12' –

Respuesta

14

caso de que arranque la matriz en C++, entonces no requiere de un tamaño que ser establecido (a pesar de que va a aceptar una), por lo que:

std::string months[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; 

compila bien con g ++ para mí y me esperar que se compile en otros lugares también. Supongo que sus errores se deben a la falta del espacio de nombre std::.

+1

¡Me faltaba dos puntos en mi declaración ARRAY_CAPACITY! Figuras, tan pronto como publico aquí, descubro mi problema. Perdón por molestarlos con una pregunta tan elemental. ¡Gracias por proporcionarme la sintaxis correcta! – Alex

6

Sí, sí:

#include <string> 

int main(void) 
{ 
    static const size_t Capacity = 12; 
    std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April", "May", 
             "June", "July", "Aug", "Sep", "Oct", 
             "Nov", "Dec" }; 
} 

Sus errores fueron probablemente relacionados con alguna otra cosa. ¿Recuerdas usar std::? Sin saber, podría ser cualquier cosa. ¿Fue Capacity del tamaño incorrecto? Etc.

Tenga en cuenta que su código no era realmente una matriz constante. Esto es:

#include <string> 

int main(void) 
{ 
    static const size_t Capacity = 12; 
    static const std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April", 
/* ^^^^^^^^^^^^ */         "May", "June", "July", "Aug", 
                "Sep", "Oct", "Nov", "Dec" }; 
} 

Además, no se necesita realmente Capacity, como otros mostrarán, y usted podría utilizar const char* si lo desea, aunque se pierde la interfaz std::string.

0

Sí. La sintaxis que utilizó en la pregunta es correcta, siempre que el compilador entienda que string es std::string y siempre que el número de inicializadores entre {} no exceda ARRAY_CAPACITY.

Por supuesto, si desea tener una matriz constante, como sugiere el título, debería haberla declarado const. Sin const su matriz tendrá un enlace externo y provocará errores de enlazador si lo coloca en un archivo de encabezado incluido en varias unidades de traducción.

const std::string MONTHS[ARRAY_CAPACITY] = { "Jan", /* and so on ... */ }; 
2

El método preferido para una matriz de cadenas constantes, probablemente sería una matriz de CStrings,

const char* MONTHS[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", 
    "Aug", "Sep", "Oct", "Nov", "Dec" }; 

Sin embargo, también se puede hacer con std :: cuerdas,

const string MONTHS[] = { string("Jan"), string("Feb"), ... }; 

Es posible que algunos compiladores no permitan la conversión implícita de char * a std :: string cuando inicializa una matriz con llaves; asignar explícitamente una std :: cadena construida a partir de un char * arreglará eso.

0

Sí, Visual C++ lo admite: acabo de hacer algo similar. No estoy seguro acerca de otras versiones de C++.

¿Ha incluido la biblioteca? ¿Cuál es la definición de ARRAY_CAPACITY?

Cuando dice 'incapaz', ¿quiere decir que tenía errores de compilador/enlazador u otra cosa?puedes darme mas detalles?

0

Supongo que quiere usar std :: string, pero en C++ esto no es posible. O al menos no así de simple. Puede usar en lugar de std :: string un simple const char * MONTH [ARRAY_CAPACITY] = {"Jan", ...}; Esto ya puede ser el truco para.

Si realmente desea utilizar std :: string, puede consultar el contenedor STL y la biblioteca de impulso (www.boost.org). Especialmente boost :: assign que puede hacer algo similar a lo que quieres hacer.

Saludos, Michael