返回信息流#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根本就没有起到枚举的作用。
这是一条镜像帖。来源:北邮人论坛 / cpp / #14635同步于 2008/10/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++的enum到底是个啥?
ericyosho
2008/10/25镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
很奇怪,如果你说enum不是类,不能上面那样重载吧
可是下面的重载它支持
istream& operator>>(istream& in, Sex& s) {
int t;
cin >> t;
s = (Sex)t;
}
这样就可以用>>来进行输入了。
可是上面的那个<< 重载咋就不顶呢。
@@
【 在 ericyosho 的大作中提到: 】
: #include <iostream>
: using namespace std;
: enum Sex {M, F};
: ...................
我用你的代码在Dev-C++跑了一下,结果就是调用了你重载的那个函数哈....
不会吧。
我在ubuntu下跑的,dev的也是gcc啊,应该没啥区别。
【 在 yywbupt 的大作中提到: 】
: 我用你的代码在Dev-C++跑了一下,结果就是调用了你重载的那个函数哈....
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};
: ...................
我一直也是这样认为的。
直到今天,尝试着cin >> [[enum]]的时候,发现enum是个类型,它的定义和初始化是可以分开。这和const 有太大的不同。
比如,
Gender g;
g = M;
于是想到从cin来初始化它,发现报的错是没有重载>>,然后重载以后竟然可以了。
种种表明,enum应该是和struct和class是有着类似的行为。
只是没想明白,为什么>>可以重载,<<不能。
【 在 wks 的大作中提到: 】
: 我一直以为enum和const int是等价的
: enum Niceboat {NICE, BOAT=3};
恩,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里面说的,嗯……