Присвоение значений перечисляемым типам - PullRequest
6 голосов
/ 09 мая 2011
enum options {Yes,No};

class A{
    int i;
    string str;
    options opt;
};


int main{
    A obj;
    obj.i=5;
    obj.str="fine";
    obj.opt="Yes"; // compiler error
}

Как назначить const char * для выбора?

Ответы [ 6 ]

14 голосов
/ 09 мая 2011

Просто выполните

   obj.opt=Yes;

Этот код:

   obj.opt="Yes";

пытается присвоить строковый литерал (совершенно другой тип) типу перечисления, который C ++ не выполняет автоматическое преобразованиедля вас.

Как можно присвоить const char * для opt?

Вам придется делать это вручную, я хотел бы сохранить набор бесплатных функций длявыполняя подобные преобразования с моими перечислениями, то есть я заверну свои перечисления в пространство имен и предоставлю некоторые функции для работы с ними:

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
}

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

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

 ...


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

Итак, вы можете видеть, что перечисления в C ++, вероятно, не дают вам всех наворотов перечислений в других языках.Вам придется самостоятельно конвертировать вещи.

3 голосов
/ 09 мая 2011

Поскольку значение перечисления не является строкой. Это правильно:

int main{
    A obj;

    obj.opt=Yes;
}
3 голосов
/ 09 мая 2011

Перечисления не являются строками, а просто значениями

obj.opt = Yes;
1 голос
/ 09 ноября 2017

Когда вы пытаетесь присвоить «Да», это означает, что вы пытаетесь присвоить строковое значение, а не константу перечисления из опций перечисления.Вместо этого используйте синтаксис:

    obj.opt = Yes;

Попробуйте напечатать значение opt из obj:

    cout << obj.opt;

Вы получите вывод как 0, так как индексы перечисления начинаются с 0. Да равно 0и нет 1.

1 голос
/ 09 мая 2011

В вашем случае вы можете "конвертировать" enum в const char*.Все, что вам нужно, это создать макрос.Например: #define ENUM_TO_CSTR(x) #x и затем: obj.opt=ENUM_TO_CSTR(Yes).

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

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

На экране будет напечатано x (не 10), поэтому будьте осторожны при использовании!

1 голос
/ 09 мая 2011

Вы не можете сделать это.Вам придется использовать некоторые сравнения строк и установить его.

...