2011-05-09 23 views

Respuesta

13

Eso sí,

obj.opt=Yes; 

este código:

obj.opt="Yes"; 

trata de asignar una cadena literal (un tipo completamente diferente) a un tipo de enumeración, que C++ no convierte automagicamente para usted.

¿Cómo se puede asignar const char * to opt?

Vas a tener que hacerlo manualmente, me gusta mantener un conjunto de funciones gratuitas en todo para hacer las conversiones de este tipo con mis enumeraciones, es decir, voy a envolver mis enumeraciones en un espacio de nombres y proporcionar algunas funciones para trabajar con ellos:

namespace options 
{ 
    enum Enum {Yes,No,Invalid}; 
    Enum FromString(const std::string& str); 
    // might also add ToString, ToInt, FromInt to help with conversions 
} 

Enum FromString(const std::string& str) 
{ 
    if (str == "Yes") 
    { 
     return Yes   
    } 
    else if (str == "No") 
    { 
     return No; 
    } 
    return Invalid; //optionally throw exception 
} 

Ahora se puede hacer:

class A{ 
    int i; 
    string str; 
    options::Enum opt; // notice change here 
}; 

... 


obj.opt=options::FromString("Yes"); 

Así se puede ver, las enumeraciones en C++, probablemente no le dará todas las campanas y silbidos de las enumeraciones en otros idiomas. Tendrá que convertir las cosas manualmente usted mismo.

+0

También proporciono las funciones de conversión de/a cadena (de hecho, envolví la creación enum en una macro solo para que se proporcionen todo el tiempo), simplemente es más fácil de leer en los registros de depuración y pasar como parámetros (para ser analizados). –

1

No se puede hacer esto. Deberá usar algunas comparaciones de cadenas y configurarlo.

3

enumeraciones no son cadenas, pero sólo valores

obj.opt = Yes; 
3

Debido a que un valor de enumeración no es una cadena. Esto es correcto:

int main{ 
    A obj; 

    obj.opt=Yes; 
} 
1

En su caso, usted puede "convertir" enumeración de const char*. Todo lo que necesitas es crear macro. Por ejemplo: #define ENUM_TO_CSTR(x) #x y luego: obj.opt=ENUM_TO_CSTR(Yes).

Esta macro convertir todo lo que pasa a ella en cadena de C-similares. No convertirá el valor de la variable, ¡solo su nombre!

int x = 10; cout << ENUM_TO_CSTR(x) << endl;

Imprimirá x (no 10) en la pantalla, así que tenga cuidado de usarlo!

0

Cuando intenta asignar "Sí" significa que usted está tratando de asignar un valor de cadena y no la constante de enumeración de las opciones de enumeración. En lugar de utilizar la sintaxis:

obj.opt = Yes; 

intente imprimir el valor de optar de obj:

cout << obj.opt; 

Usted obtendrá la salida como 0, ya que los índices de enumeración empiezan desde 0. Si es 0 y n es 1 .

Cuestiones relacionadas