2010-09-16 10 views
9

¿Es posible declarar una cadena en un archivo de encabezado (.h) en la definición de Clase?¿Puedo declarar una cadena en un archivo de encabezado en una definición de una clase?

Cuando quiero establecer un valor predeterminado int, que hago:

class MyClass 
{ 
    static const unsigned int kDATA_IMAGE_WIDTH = 1024; 

¿Hay una manera de hacer lo mismo con el objeto string?

class MyClass 
{ 
     static const string kDEFAULT_FILE_EXTENSION = "png"; // fail 

Sé que puedo utilizar #define ...

#define kDEFAULT_FILE_EXTENSION "png" 

gracias

edición: añadió que se encuentra en una definición de clase. ejemplos actualizados.

+0

Qué compilador está usando y lo que es el error? Funciona para mi. – vanza

+0

Xcode (gcc is it?) Error es: 'error: inicialización no válida en clase de datos estáticos miembro de tipo no integral 'const std :: string'' – Ross

+0

¿Está seguro de que se encuentra dentro del espacio de nombres correcto. Prueba std :: string. ¿Estás haciendo esto dentro de una clase? –

Respuesta

11

Desde el mensaje de error que le dio (el énfasis es mío):

error: invalid in-class initialization of static data member of non-integral type 'const std::string'

Usted puede hacer esto en un archivo de cabecera, pero no pueden hacerlo en una clase.

Es decir:

class MyClass 
{ 
    static const std::string invalid = "something"; 
}; 

no es válida, pero

static const std::string valid = "something else"; 

es válido.

Si desea que la estática para ser un miembro de la clase única, esto se hace:

//Header 
class MyClass 
{ 
    static const std::string valid; 
}; 


//Implementation (.cpp) file 

const std::string MyClass::valid = "something else again"; 

Sólo variables de clase static const integrales se pueden inicializar utilizando el "= constante" sintaxis.

+0

Lo sentimos, está dentro de un definición de clase. He actualizado mi pregunta. Gracias – Ross

+0

@Ross: Bueno, mi respuesta no cambia. ;) La última caja de códigos le dice cómo hacer esto correctamente. –

+0

Tuve que eliminar la palabra clave 'static' del archivo de implementación (.cpp). –

1

sí, pero las cadenas no son intrínsecas a C++. necesita el #include adecuado

#include <string> 

static const std::string kDEFAULT_FILE_EXTENSION = "png"; 

En una nota lateral. Nunca he visto código C++ usar el prefijo k para denotar una constante. Creo que es una convención de Objective-C. Además, los símbolos ALL_CAPS deberían estar reservados para #define macros, no para las constantes de lenguaje.

+0

hmmm, gracias, pero no me funciona? ...: 'error: inicialización inválida en clase de datos estáticos miembro de tipo no integral 'const std :: string'' – Ross

+1

No me di cuenta de que estaba tratando de hacer esto dentro de una clase. – Ferruccio

+0

Apologías ... mi inexperiencia, debería haberlo mencionado. – Ross

0

Sí, debería ser capaz de declarar cadenas o poner cualquier otro tipo de código en su archivo de encabezado. Puede estar fallando porque al archivo de cabecera le falta el #include que define la cadena, o debe poner un "std ::" delante de él si no está "usando namespace std" en el archivo de cabecera.

Por favor, actualice su pregunta con el error de compilación específico que está viendo si estas sugerencias no lo corrigen. Espero que esto ayude.

0

no tengo el contexto aquí, pero si la intención es definir un conjunto inmutable de caracteres terminada por un '\ 0', ¿por qué no usar:

static const char kDEFAULT_FILE_EXTENSION [] = "png ";

Además, tenga en cuenta que no hay conversión transparente entre la clase de cuerdas y const char * cadena sin invocar :: c_str() ..

0

dos opciones:

definir una función en la cabecera que es estática y devuelve la cadena que desea.

static std::string kDEFAULT_FILE_EXTENSION() 
    { 
     return "png"; 
    } 

Una macro hará lo correcto

#define STATIC_STRING_IN_HEADER(name,value) static std::string name(){return value;} 
STATIC_STRING_IN_HEADER(kDEFAULT_FILE_EXTENSION,"png") 
Cuestiones relacionadas