ошибка при объявлении перечисления для переменной - PullRequest
0 голосов
/ 27 июля 2011

У меня следующий синтаксис:

enum home
{
no,
yes,
}homew;

home homes;

std::string s;
s="no";

homes=s; //is not working. Why?

Я был неправ?

Ответы [ 6 ]

1 голос
/ 27 июля 2011
  1. Это

    enum home { no, yes, } homew;
    

    определяет тип home плюс переменную homew этого типа.
    Вы это хотели? Зачем?

  2. Значения, определенные для типа enum, являются литералами и должны использоваться следующим образом:

    home homes = no;
    
  3. В C ++ нет встроенного способа преобразования между литералами значений перечислений и их строковым представлением. Если вам это нужно, вам придется приготовить себе .

1 голос
/ 27 июля 2011

Вы путаете строки с перечисляемыми значениями.

Переменная enum - это просто целое число, для которого вы можете использовать литерал во время компиляции, не более того.

Это делаеткод более понятен и самодокументирован, а не просто использует числовой литерал.

0 голосов
/ 27 июля 2011

Как указывалось другими, значения перечислений имеют тип int. Вместо этого вы можете написать небольшую функцию, которая преобразует из enum в String, например:

std::string GetStringFromEnum(home iHome)
{
 switch (home)
 {
  case yes: return "yes";
  case no: return "no"; break;
  default: return "here be dragons";
 }
}

и наоборот:

home GetEnumFromString(std::string iImput)
{
 if (iImput == "yes") return yes;
 return no; //if you extend the enum beyond 2 values, this function will get more complicated
}

и вы можете изменить свой код следующим образом:

homes = GetStringFromEnum(no)

Недостатком этого подхода является то, что если вы изменяете перечисление, вы также должны изменить функцию преобразования.

НТН,
JP

0 голосов
/ 27 июля 2011
typeof(home) != typeof(std::string) // types are not equal

Таким образом, вы не можете назначить enum на std::string или иным образом. Однако возможно неявное преобразование между enum и целыми типами, такими как bool, int и т. Д.

Есть ли способ решить мою проблему такой, какая она есть?

Если возможно, используйте std::map.

std::map<std::string, home> myTypes;
myTypes["yes"] = yes;
myTypes["no"] = no;

Теперь вы можете сделать,

homes = myTypes["no"];
0 голосов
/ 27 июля 2011

Не компилируется, потому что C ++ не предоставляет встроенного механизма для преобразования из std::string в enum.

0 голосов
/ 27 июля 2011

перечисления в C ++ неявно являются типом данных int.Вы не можете присвоить строковые значения перечислению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...