CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

enum

楼主Viper()2001-04-11 16:42:00 在 C/C++ / C语言 提问

我写了一个测试程序来重载枚举类型的++运算符。如下。  
   
  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时总是编译错误,提示该运算符没定义,请指教。 问题点数:20、回复次数:10Top

1 楼winjoy()回复于 2001-04-11 18:10:00 得分 5

声名处:  
  friend   EffectType&   operator++(   EffectType&   e   );  
  ~~~~~~加上友元  
   
   
  定义处:  
  CTestEffectProc::EffectType&    
  CTestEffectProc::operator++(   CTestEffectProc::EffectType&   e   )  
  ~~~~~~~~~~~~~~~~~去掉  
  成为  
  CTestEffectProc::EffectType&    
  operator++(   CTestEffectProc::EffectType&   e   )  
  Top

2 楼Viper()回复于 2001-04-11 19:49:00 得分 0

一定要把静态成员函数变为全局友元函数??Top

3 楼ed9er(始祖鸟)回复于 2001-04-12 09:50:00 得分 6

c++里面好象对enum的定义有点模糊,它是一个datatype,但又不能当做一个class来用,你说“成员函数”,是谁的成员?如果非得把operator++弄成private的话,只能是另写一个类把enum包起来,全部private,然后CTestEffectProc做为它的friendTop

4 楼Viper()回复于 2001-04-13 10:14:00 得分 0

因为枚举类型定义在CTestEffectProc类中,而我也只想该类中使用该枚举的++运算符,所以我想在CTestEffectProc是重载该枚举的运算符,不想把它写成全局友元函数。Top

5 楼ed9er(始祖鸟)回复于 2001-04-13 15:19:00 得分 0

是谁的成员?你需要的是this是EffectType*,不是CTestEffectProc*,你把它作为CTestEffectProc的成员函数一点道理没有Top

6 楼Viper()回复于 2001-04-13 16:12:00 得分 0

你仔细看看,我用的可是静态成员函数,没有this指针。Top

7 楼myan()回复于 2001-04-13 17:52:00 得分 0

Viper,这下你可中招了!enum是一个编译期量,也就是说,编译的时候就要把每个  
  enum量定死,运行时不能变化。例如,EffectType   et   =   Wind;   编译器检查了类型、  
  确定了值,等到形成编译单元以后,什么EffectType,Wind,全都没了,只有et=1  
  同理,++et就被翻译成++1。这结果如何,不言自明。Top

8 楼Viper()回复于 2001-04-13 18:09:00 得分 0

to   myan:  
  事实上只要写成全局函数就可以重载了,但写成静态成员函数就是不行。Top

9 楼myan()回复于 2001-04-13 19:55:00 得分 9

我仔细看了看,才知道你的本意。  
  首先,我对于这种设计表示不敢恭维。无论是出于什么原因,这样的设计都是对C++  
  最糟糕的使用范例。我一向的观念是,设计上出了问题,就算是语言技巧用的再漂亮,  
  也是下乘。  
   
  我前面所说的没有错误,enum不能做自增运算,请先清楚这一点。  
   
  然后,你为什么认为在CTestEffectProc类作用域里调用++m_et  
  时C++会那么自觉地为你调用你定义的operator++()?我从来没有  
  学到过这样一条规则啊?请你重温一下,在什么情况下一个类中定  
  义的运算符重载会被调用。在这里,C++肯定到全局域中去找对于  
  EffectType的++操作。由于没有,就会找缺省的enum的++操作,  
  上面我说过,enum不能进行++操作,所以报错。  
   
  我觉得你学习的方向有一点问题,如果总是去追究细节,十年也  
  完不了。应该首先了解什么是正确的风格,然后研究与之相关的  
  语言特性,毕竟学是为了用。如果你真的对C++语言的各种细节  
  感兴趣,不如学习编写一个C++编译器。  
  Top

10 楼Viper()回复于 2001-04-16 08:49:00 得分 0

to   myan:  
        thank   u!  
        我想自己是有点糊涂了。重载操作符只会调用成员函数或全局函数,不会调用静态成员函数。Top

相关问题

  • typedef enum和enum的区别
  • EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS)的问题?
  • 关于enum类型。
  • enum怎么用的?
  • How to use enum type in ActiveX control
  • 关于enum类型问题
  • 定义enum的大小
  • 如何打印enum中的...........
  • 小弟的enum问题?
  • 如此Enum,怎么写

关键词

  • c++
  • 函数
  • 语言
  • effecttype
  • ctesteffectproc
  • 运算符
  • enum
  • 调用
  • 重载
  • 成员

得分解答快速导航

  • 帖主:Viper
  • winjoy
  • ed9er
  • myan

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo