enum

招RD和QA 2001-04-11 04:42:00
我写了一个测试程序来重载枚举类型的++运算符。如下。

class CTestEffectProc : public CGameProc
{
public:
enum EffectType { ET_Start, Fire = ET_Start, Wind, Dark, Earth,               Ice, Light, ET_End = Light };

protected:
static
EffectType& operator++( EffectType& e );
static
const EffectType operator++( EffectType& e, int );

     EffectType m_eEffectType;
.................
};


CTestEffectProc::EffectType&
CTestEffectProc::operator++( CTestEffectProc::EffectType& e )
{
return e;
}

const CTestEffectProc::EffectType
CTestEffectProc::operator++( CTestEffectProc::EffectType& e, int )
{
return e;
}

可是当我在类中使用++m_eEffectType时总是编译错误,提示该运算符没定义,请指教。
...全文
550 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
招RD和QA 2001-04-16
  • 打赏
  • 举报
回复
to myan:
thank u!
我想自己是有点糊涂了。重载操作符只会调用成员函数或全局函数,不会调用静态成员函数。
招RD和QA 2001-04-13
  • 打赏
  • 举报
回复
因为枚举类型定义在CTestEffectProc类中,而我也只想该类中使用该枚举的++运算符,所以我想在CTestEffectProc是重载该枚举的运算符,不想把它写成全局友元函数。
myan 2001-04-13
  • 打赏
  • 举报
回复
我仔细看了看,才知道你的本意。
首先,我对于这种设计表示不敢恭维。无论是出于什么原因,这样的设计都是对C++
最糟糕的使用范例。我一向的观念是,设计上出了问题,就算是语言技巧用的再漂亮,
也是下乘。

我前面所说的没有错误,enum不能做自增运算,请先清楚这一点。

然后,你为什么认为在CTestEffectProc类作用域里调用++m_et
时C++会那么自觉地为你调用你定义的operator++()?我从来没有
学到过这样一条规则啊?请你重温一下,在什么情况下一个类中定
义的运算符重载会被调用。在这里,C++肯定到全局域中去找对于
EffectType的++操作。由于没有,就会找缺省的enum的++操作,
上面我说过,enum不能进行++操作,所以报错。

我觉得你学习的方向有一点问题,如果总是去追究细节,十年也
完不了。应该首先了解什么是正确的风格,然后研究与之相关的
语言特性,毕竟学是为了用。如果你真的对C++语言的各种细节
感兴趣,不如学习编写一个C++编译器。
招RD和QA 2001-04-13
  • 打赏
  • 举报
回复
to myan:
事实上只要写成全局函数就可以重载了,但写成静态成员函数就是不行。
myan 2001-04-13
  • 打赏
  • 举报
回复
Viper,这下你可中招了!enum是一个编译期量,也就是说,编译的时候就要把每个
enum量定死,运行时不能变化。例如,EffectType et = Wind; 编译器检查了类型、
确定了值,等到形成编译单元以后,什么EffectType,Wind,全都没了,只有et=1
同理,++et就被翻译成++1。这结果如何,不言自明。
招RD和QA 2001-04-13
  • 打赏
  • 举报
回复
你仔细看看,我用的可是静态成员函数,没有this指针。
ed9er 2001-04-13
  • 打赏
  • 举报
回复
是谁的成员?你需要的是this是EffectType*,不是CTestEffectProc*,你把它作为CTestEffectProc的成员函数一点道理没有
ed9er 2001-04-12
  • 打赏
  • 举报
回复
c++里面好象对enum的定义有点模糊,它是一个datatype,但又不能当做一个class来用,你说“成员函数”,是谁的成员?如果非得把operator++弄成private的话,只能是另写一个类把enum包起来,全部private,然后CTestEffectProc做为它的friend
招RD和QA 2001-04-11
  • 打赏
  • 举报
回复
一定要把静态成员函数变为全局友元函数??
winjoy 2001-04-11
  • 打赏
  • 举报
回复
声名处:
friend EffectType& operator++( EffectType& e );
~~~~~~加上友元


定义处:
CTestEffectProc::EffectType&
CTestEffectProc::operator++( CTestEffectProc::EffectType& e )
~~~~~~~~~~~~~~~~~去掉
成为
CTestEffectProc::EffectType&
operator++( CTestEffectProc::EffectType& e )

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧