LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1018|回复: 8

重载C++运算符,编译出错![已经解决]

[复制链接]
发表于 2007-1-2 09:26:39 | 显示全部楼层 |阅读模式
照书上搬的C++程序:

#include <iostream>
#include <stdlib.h>
using namespace std;

class Calculator
{
public:
        Calculator(){value = 0;};
        void operator ++();                                //重载自增算符
        void operator --();                                //重载自减算符
        unsigned int operator()();                //重载括号算符
private:
        unsigned int value;
};

void Calculator:perator ++()
{
        if(value < 65535) value ++;        //使用语言预定议版本
        else{
                cout<<"\nData overflow!"<<endl;
                abort();
        }
}

void Calculator:perator --()
{
        if(value > 0) value --;
        else{
                cout<<"\nData overflow!"<<endl;
                abort();
        }
}

unsigned int Calculator:perator ()()
{
        return value;
}

int main()
{
        Calculator Counter;
        int i;
        for(i=0; i<5; i++){
                Counter ++;                //Counter.operator ++()    此为第44行,出错地方一
                cout<<"\nCounter = "<<Counter();
        }
       
        for(i=0; i<=5;  i++){
                Counter --;                //Counter.operator --()      此为第49行,出错地方二
                cout<<"\nCounter = "<<Counter();
        }
}

编译出错信息:
play.cpp: In function ‘int main()’:
play.cpp:44: 错误:‘operator++(int)’ 没有出现在后缀 ‘++’ 中,尝试使用前缀运算符
play.cpp:49: 错误:‘operator--(int)’ 没有出现在后缀 ‘--’ 中,尝试使用前缀运算符
 楼主| 发表于 2007-1-2 09:34:41 | 显示全部楼层
但若是将上述出错两行改为:
Counter.operator ++();       
Counter.operator --();
当然OK。
问题就是,好像编译程序不能识别经重载的运算符
回复 支持 反对

使用道具 举报

发表于 2007-1-2 10:12:35 | 显示全部楼层
void Calculator::perator --(int)
在括号里面加上int看看呢
回复 支持 反对

使用道具 举报

发表于 2007-1-2 10:22:38 | 显示全部楼层
不要乱猜疑编译器。先去怀疑你所用的书。

C++的自增和自减运算符重载是分前缀操作和后缀操作的。你定义的操作符格式是前缀操作的,但是你在使用它时是用了后缀操作方式。

找一本好书来学C++吧,宁可多花一点钱买本大部头。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 11:25:07 | 显示全部楼层
lyanry兄,你怎么知道我定义的是前缀的?那有什么办法令到我定义的是后缀的?
我看的书是:《C++程序设计基础》 电子工业出版社  周蔼如 林伟健 编著

这书的例子说是都能在VC++6.0通过,我用的是G++
回复 支持 反对

使用道具 举报

发表于 2007-1-2 11:37:52 | 显示全部楼层
Post by hoho_zhao
lyanry兄,你怎么知道我定义的是前缀的?那有什么办法令到我定义的是后缀的?
我看的书是:《C++程序设计基础》 电子工业出版社  周蔼如 林伟健 编著

这书的例子说是都能在VC++6.0通过,我用的是G++
VC++ 不是标准C++。。。
回复 支持 反对

使用道具 举报

发表于 2007-1-2 13:06:31 | 显示全部楼层
前缀与后缀是有区别的。
前缀的函数没有形参;后缀,函数有一个int形参,但这个形参没什么作用,它主要用来区别前缀和后缀。
呵呵,g++的错误输出信息还是挺丰富的。
回复 支持 反对

使用道具 举报

发表于 2007-1-2 13:42:35 | 显示全部楼层
Post by dave3068
VC++ 不是标准C++。。。


VC++ 6.0太差了,我们在实际应用中已经发现N多编译器的BUG了(确定是编译器的),比如scanf("%f", &a)的BUG是众所周知的,还有结构体内数组元素定位的BUG(均使用g++对比确认)。我想这些在VC++.NET应该会有所修正吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 16:01:00 | 显示全部楼层
tianshanxue2005  和  lyanry 说的没错,我在 void Calculator:erator --()
中加入int 即void Calculator:erator --(int),就OK了。

续问:楼上所说的,scanf("%f", &a)的BUG是什么?在Linux C/C++下也有这个BUG么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表