BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #14635同步于 2008/10/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++的enum到底是个啥?

ericyosho
2008/10/25镜像同步21 回复
#include <iostream> using namespace std; enum Sex {M, F}; class P { Sex s_; friend ostream& operator<< (ostream& out, const Sex& s) { cout << "quite" << endl; switch(s) { case(M): out << 'M'; break; case(F): out << 'F'; break; } return out; } public: P(const Sex& s=M): s_(s) {}; const Sex& getSex() const { return s_; } void setSex(const Sex& s) { s_ = s; } }; int main() { P p; // P pa((Sex)2); cout << p.getSex() << endl; return 0; } 两个问题: 这段代码直接没反应啊…… 重载了,还是直接显示0或者1. 还有就是,如果把注释去掉,会发现,pa里面的那个s_变成2了,enum根本就没有起到枚举的作用。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ericyosho机器人#1 · 2008/10/25
很奇怪,如果你说enum不是类,不能上面那样重载吧 可是下面的重载它支持 istream& operator>>(istream& in, Sex& s) { int t; cin >> t; s = (Sex)t; } 这样就可以用>>来进行输入了。 可是上面的那个<< 重载咋就不顶呢。 @@
yywbupt机器人#2 · 2008/10/25
【 在 ericyosho 的大作中提到: 】 : #include <iostream> : using namespace std; : enum Sex {M, F}; : ................... 我用你的代码在Dev-C++跑了一下,结果就是调用了你重载的那个函数哈....
ericyosho机器人#3 · 2008/10/25
不会吧。 我在ubuntu下跑的,dev的也是gcc啊,应该没啥区别。 【 在 yywbupt 的大作中提到: 】 : 我用你的代码在Dev-C++跑了一下,结果就是调用了你重载的那个函数哈....
wks机器人#4 · 2008/10/25
我一直以为enum和const int是等价的 enum Niceboat {NICE, BOAT=3};
Xer机器人#5 · 2008/10/25
1 你重载的那个<<是P的成员函数吧,在main里面调用cout<<p.getSex()就相当于调用cout<<(enum Sex)tmp_val,怎么会调用P的成员函数呢?除非改一下定义然后cout<<P。如果把重载的<<放到P的定义外就行了。 2 It is possible to define an enumeration that has values not defined by any of its enumerators. 这是C++03里面说的,嗯…… 【 在 ericyosho (ericyosho) 的大作中提到: 】 : #include <iostream> : using namespace std; : enum Sex {M, F}; : ...................
lijinwinter机器人#6 · 2008/10/25
我一直也是这样认为的。 直到今天,尝试着cin >> [[enum]]的时候,发现enum是个类型,它的定义和初始化是可以分开。这和const 有太大的不同。 比如, Gender g; g = M; 于是想到从cin来初始化它,发现报的错是没有重载>>,然后重载以后竟然可以了。 种种表明,enum应该是和struct和class是有着类似的行为。 只是没想明白,为什么>>可以重载,<<不能。 【 在 wks 的大作中提到: 】 : 我一直以为enum和const int是等价的 : enum Niceboat {NICE, BOAT=3};
lijinwinter机器人#7 · 2008/10/25
恩,Xer说的对。 是这个地方。 要把函数的定义放在外面就OK了。 【 在 Xer 的大作中提到: 】 : 1 你重载的那个<<是P的成员函数吧,在main里面调用cout<<p.getSex()就相当于调用cout<<(enum Sex)tmp_val,怎么会调用P的成员函数呢?除非改一下定义然后cout<<P。如果把重载的<<放到P的定义外就行了。 : 2 It is possible to define an enumeration that has values not defined by any of its enumerators. : 这是C++03里面说的,嗯……
huyuanmeix机器人#8 · 2008/10/25
在vc6.0里跑的,可以用啊
ericyosho机器人#9 · 2008/10/25
嗯,C++编译器,直接无视VC6.0……