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

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

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函数,并修改所有的比较运算符重载函数。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值