2010-04-17 170 views
2

我的问题是关于枚举,我的代码是:C++枚举

#include<iostream> 
using namespace std; 
int main() 
{ 
    enum bolumler {programcilik,donanim,muhasebe,motor,buro} bolum; 
    bolum = donanim; 
    cout << bolum << endl; 
    bolum += 2; // bolum=motor 
    cout << bolum; 

    return 0; 
} 

输出应该但根据这些代码的错误是:

error C2676: binary '+=' : 'enum main::bolumler' does not define this operator or a conversion to a type acceptable to the predefined operator 
Error executing cl.exe. 

111.obj - 1 error(s), 0 warning(s) 

你能帮忙我呢?另一个问题是,如果我想看到像“muhasebe”这样的输出结果,我该怎么办?

+0

使用编辑器中的源代码按钮,否则很难阅读。 – mingos 2010-04-17 23:19:37

+0

请格式化您的代码。 – jweyrich 2010-04-17 23:19:56

+2

事实上,所有失败的原因是因为即使是枚举,E1 + E2也是E1 = E1 + E2。但'+'内置运算符不会返回枚举类型,所以'+ ='的使用会失败。 – 2010-04-17 23:33:52

回答

1

除非您定义operator+=,否则不能在enum类型的变量上使用+=

如果你真的需要你可以添加2,然后回到枚举类型,但这不是很好的代码。

bolum = (bolumler)(bolum + 2); /* bolum=motor */ 

关于你的另一个问题:

111.obj - 1个错误,0个警告你能帮我的另一个问题是,我能做些什么,如果我想看到像“muhasebe”这样的输出?

您需要手动将enum变量转换为带有switch语句的字符串。

std::string enum_to_string(bolumler val) 
{ 
    swtich(val) 
    { 
     case programcilik: 
     return "programcilik"; 
     //.... 
+2

不用写'operator + ='定义就可以了。 – 2010-04-17 23:25:46

+0

添加,除非我的答案。 – 2010-04-18 12:23:10

0

枚举不是int类型的,虽然值被数值vals替代。因此,你不能在其上使用操作符。使用整数而不是枚举来使其工作。

对于字符串输出,您必须使用字符串。描述符的名称不能显示为字符串。无论如何编写代码时,描述符通常会被完全剥离,所以在拆分程序后甚至找不到它们。

1

按照定义,你不能对枚举类型进行这种算术运算。如果你需要它,自己写+ =运算符,就像这样:

bolumler& operator+=(bolumler& v1, int v2) { 
    return v1 = bolumler(int(v1) + v2); 
} 
+0

问题在于它没有正确溢出,也就是'buro + = 1'不是'programcilik'。另外,如果我可以说'a + = b',我希望'a + b'也能工作,所以'bolumler operator +(bolumler,bolumler)'也应该超载。 (然后是'a-b'和'a- = b'。)但是,超载运营商是第一个解决这个问题的非常方法,所以尽管如此,我还是+1。 – sbi 2010-04-18 08:43:51

+0

@sbi是的,该值不会自动打包。最好的做法是编写一个宏或模板类来声明给定类型的所有运算符。谢谢btw :) – jweyrich 2010-04-18 17:42:50

0

的问题是,枚举可以隐式转换为int,但int不能隐式转换为枚举类型。

当您添加2〜枚举,其结果是intunsigned int(或可能还有一些其他的整数类型,如果枚举包含真正的大值),这是不允许被分配回枚举没有投。为了保留这个限制,枚举上也没有+=运算符。

你可以声明bolum为int,而不是被枚举类型的,或者你可以写这样的:

bolum = static_cast<bolumler>(bolum+2); 

但要注意,这是一个有点冒险。 bolum+2仍然在枚举类型bolumler的有效范围内,实际上也是buro+2由于技术原因与确定枚举范围的确切方式有关。但是一般情况下,你不能只在枚举值中加2,并且期望它仍然在枚举的范围内。使用枚举类型而不是int的唯一目的是为了获得额外的类型安全性:如果你不需要,那么只需为你需要的值定义一堆整数常量。

0

真正的问题是,你试图实现的东西在枚举的上下文中没有意义。

您可以用任何值代替2,但如果返回的值不对应于枚举的任何值,会发生什么情况?它没有定义...

我已经遇到了问题几次,特别是它似乎完全合理迭代枚举的值...我发现唯一的解决方案是将值存储到一个容器(例如,vector),然后遍历容器。