将枚举分配给变量

时间:2016-05-09 23:41:48

标签: c++ enums

我正在创建一个代码,根据用户输入显示一年中的几个月,但是我在" mes = n" 行收到错误。这是以下代码:

#include <iostream>
using namespace std;
int main(){
int n = 0;
enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,   
Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes;
cin>>n;
mes = n; // That's where I get an error!
switch(mes)
{
    case Janeiro: cout<<"janeiro"; break;
    case Fevereiro: cout<<"fevereiro"; break;
    case Marco: cout<<"marco"; break;
    case Abril: cout<<"abril"; break;
    case Maio: cout<<"maio"; break;
    case Junho: cout<<"junho"; break;
    case Julho: cout<<"julho"; break;
    case Agosto: cout<<"agosto"; break;
    case Setembro: cout<<"setembro"; break;
    case Outubro: cout<<"outubro"; break;
    case Novembro: cout<<"novembro"; break;
    case Dezembro: cout<<"dezembro"; break;
    default: cout<<"invalido"; break;
}
return 0;
}    

编译错误是:&#34;无效转换从int到main():: meses&#34;。

4 个答案:

答案 0 :(得分:3)

在标准C ++中,没有隐式转换 enum类型。所以你不能简单地写mes = n;。要进行此转换,您需要明确地进行此转换,例如:

mes = static_cast<meses>(n);

但是, 是从未作用域的enum s int的隐式转换。 (从技术上讲,这是整数提升)。所以你不需要演员:

int x = Janeiro;

因此,您问题的另一个解决方案是使用int来存储输入的值。事实上,您已经n履行了这个角色:

switch(n)
{
case Janeiro: .....

如上所述,case Janeiro不需要强制转换,因为未编组的枚举器会提升为整数类型。

从技术上讲,如果枚举数大于std::underlying_type<meses>::type,则应使用int代替INT_MAX

如果你想要两个转换方向都需要一个强制转换(enum到int,int到enum),那么你必须使用范围的枚举,即enum class meses。< / p>

答案 1 :(得分:1)

有几个问题,我给你3个可能的修复和解释如下:

#include <iostream>
using namespace std;
int main(){
    int n = 0;
    //Using a local variable only:
    //*
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,   
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}mes;
    cin>>n;
    mes = (meses)n; // Cast to convert int into a meses_type
    //*/

    //Or declaring the enum:
    /*
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,   
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12};
    cin>>n;
    meses mes = (meses)n; // Cast to convert int into a meses_type
    //*/

    // Using typedef
    /*
    typedef enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,   
    Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12}meses_type;
    cin>>n;
    meses_type mes = (meses_type)n; // Cast to convert int into a meses_type
    //*/

    switch(mes)
    {
        case Janeiro: cout<<"janeiro"; break;
        case Fevereiro: cout<<"fevereiro"; break;
        case Marco: cout<<"marco"; break;
        case Abril: cout<<"abril"; break;
        case Maio: cout<<"maio"; break;
        case Junho: cout<<"junho"; break;
        case Julho: cout<<"julho"; break;
        case Agosto: cout<<"agosto"; break;
        case Setembro: cout<<"setembro"; break;
        case Outubro: cout<<"outubro"; break;
        case Novembro: cout<<"novembro"; break;
        case Dezembro: cout<<"dezembro"; break;
        default: cout<<"invalido"; break;
    }
    return 0;
} 

第一个解决方案就是我的想法。

1)创建一个名为enum meses的{​​{1}}类型的变量。对于该变量,枚举类型只能在此处使用一次。 2)创建枚举,然后创建变量。这样,您可以创建该枚举类型的多个实例。 3)使用typedef来缩短名称(尽管不是非常有用,对于struct而言比enum更有趣)。

最后,要将int放入枚举类型的变量中,需要将into转换为枚举类型。 C ++认为这些东西是完全不同的对象(即使枚举最终只是一堆整数)。

答案 2 :(得分:0)

您的语法错误。这应该是这样的:

enum meses {
  Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
  Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12
};
cin>>n;
meses mes = n;
switch(mes)
...

或者对于作用域枚举(c ++ 11):

enum class meses {
  Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, Junho= 6,
  Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10,Novembro = 11, Dezembro = 12
};
...

您可以使用meses::janiero等...

答案 3 :(得分:0)

您可以使用switch(n)

int main() {
    int n = 0;
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, 
        Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10, 
        Novembro = 11, Dezembro = 12};

    cin >> n;
    switch(n)
    {
        case Janeiro: cout<<"janeiro"; break;
        case Fevereiro: cout<<"fevereiro"; break;
        case Marco: cout<<"marco"; break;
        case Abril: cout<<"abril"; break;
        case Maio: cout<<"maio"; break;
        case Junho: cout<<"junho"; break;
        case Julho: cout<<"julho"; break;
        case Agosto: cout<<"agosto"; break;
        case Setembro: cout<<"setembro"; break;
        case Outubro: cout<<"outubro"; break;
        case Novembro: cout<<"novembro"; break;
        case Dezembro: cout<<"dezembro"; break;
        default: cout<<"invalido"; break;
    }
    return 0;
}    

或使用static_cast<meses>(n)

int main() {
    int n = 0;
    enum meses {Janeiro = 1, Fevereiro = 2, Marco = 3, Abril = 4, Maio = 5, 
        Junho= 6, Julho = 7, Agosto = 8, Setembro = 9, Outubro = 10, 
        Novembro = 11, Dezembro = 12}mes;

    cin >> n;
    mes = static_cast<meses>(n);
    switch(mes)
    {
        case Janeiro: cout<<"janeiro"; break;
        case Fevereiro: cout<<"fevereiro"; break;
        case Marco: cout<<"marco"; break;
        case Abril: cout<<"abril"; break;
        case Maio: cout<<"maio"; break;
        case Junho: cout<<"junho"; break;
        case Julho: cout<<"julho"; break;
        case Agosto: cout<<"agosto"; break;
        case Setembro: cout<<"setembro"; break;
        case Outubro: cout<<"outubro"; break;
        case Novembro: cout<<"novembro"; break;
        case Dezembro: cout<<"dezembro"; break;
        default: cout<<"invalido"; break;
    }
    return 0;
}