【重构练习】大二作业 第4部分
2017-11-25 18:56
204 查看
一番修改后,发现比较函数如
它们只是函数参数不同,但是在函数内部的代码是一样的
毫无疑问这里需要想办法将两个代码合并。
观察代码发现,这两个函数都调用BigAmount的CompareTo函数,只不过一个调用的参数是“BigAmount&”类型,另一个是“long long”类型。
而后者只是将这个long long类型的参数转成BigAmount类型后,再调用前者。
我做了一点小测试,发现要做到这一点还是比较方便的。
首先将函数
的两个参数前面,以及括号的后面分别加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函数,并修改所有的比较运算符重载函数。
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函数,并修改所有的比较运算符重载函数。
相关文章推荐
- 【重构练习】大二作业 第3部分
- 【重构练习】大二作业 第0部分
- 【重构练习】 大二作业 第1部分
- 【重构练习】大二作业 第2部分
- Java贪吃蛇,部分实现,适合作为新手练习作业。
- c语言选择结构作业题练习分享第二部分(附答案、考点、难度、分析)
- 员工管理系统(数据库部分)--一个老师很久就布置的作业
- 内存管理作业练习
- python从入门到实践第三章的课后练习作业
- 【DAY5】第五天的关于接口的作业练习
- 软件项目管理第六周作业(知识点部分)
- 系统管理-第4部分 系统配置
- #每日Linux小练习#11作业命令继续分析
- 部署Vista – 第4部分:理解部署场景
- 012 重构用户名(第三部分)
- C语言练习作业(四)
- 第四章计算器程序部分代码,结合练习
- JAVA基础作业练习—自定义异常之模拟ATM
- bugku CTF-练习平台 部分writeup
- 部分重构代码