【重构练习】大二作业 第4部分

来源:互联网 发布:淘宝买零食有毒吗 编辑:程序博客网 时间:2024/06/15 02:50

一番修改后,发现比较函数如

friend bool operator<(BigAmount& ba1,BigAmount& ba2);friend bool operator<(BigAmount& ba1,long long ba2);

它们只是函数参数不同,但是在函数内部的代码是一样的
bool operator<(BigAmount& ba1,BigAmount& ba2){return ba1.CompareTo(ba2) == -1;}bool operator<(BigAmount& ba1,long long ba2){return ba1.CompareTo(ba2) == -1;}

毫无疑问这里需要想办法将两个代码合并。

观察代码发现,这两个函数都调用BigAmount的CompareTo函数,只不过一个调用的参数是“BigAmount&”类型,另一个是“long long”类型。

而后者只是将这个long long类型的参数转成BigAmount类型后,再调用前者。

int BigAmount::CompareTo(BigAmount& ba2){    //balabala}int BigAmount::CompareTo(long long ba2){return CompareTo(BigAmount(ba2));}
因此,我想如果能在传long long类型参数的时候就完成类型转换,就可以合并运算符重载函数。

我做了一点小测试,发现要做到这一点还是比较方便的。


首先将函数

friend bool operator<(BigAmount& ba1,BigAmount& ba2);

的两个参数前面,以及括号的后面分别加const关键字,如下所示

friend bool operator<(const BigAmount& ba1,const BigAmount& ba2);

这样一来当传入long long 类型的参数时,就可以自动转换为BigAmount类型。

但是这样还不够,函数内部调用的是CompareTo函数,这个函数的参数是BigAmount&类型,也要在前面加上const关键字。此外函数的参数列表括号之后也要加上const关键字。

//原来的代码int CompareTo(BigAmount &ba2);//修改后的代码int CompareTo(const BigAmount &ba2) const;
CompareTo函数以及运算符函数的实现部分也作如上处理。

------------------------------------------------------------------------------------------

修改完成之后,我决定进行一下测试。由于运算符重载函数在执行时仅将参数传给CompareTo函数,所以测试的主要对象是修改后的CompareTo函数,而且因为只修改了函数的首部,所以只要判断程序是否正常运行即可。

在测试之前,先将CompareTo的long long参数版本的声明和实现注释掉。

然后将main函数里已有的测试代码复制到另一个地方,最后编写测试程序。(不清楚C++有哪些测试工具。。。)

int _tmain(int argc, _TCHAR* argv[]){BigAmount test1,test2;long long testLong;cout<<"请输入大整数1 以及大整数2:"<<endl;cin>>test1>>test2;cout<<"请输入long long类型的数值:"<<endl;cin>>testLong;cout<<"大整数1.CompareTo(大整数2)的结果是:"<<test1.CompareTo(test2)<<endl;cout<<"大整数1.CompareTo(long long)的结果是:"<<test1.CompareTo(testLong)<<endl;return 0;}int oldTest(){//这里存放原先的测试代码}
编译程序,程序能正常运行。说明改动并没有出问题,删掉之前注释的CompareTo函数,并修改所有的比较运算符重载函数。



原创粉丝点击