问题描述
||
我需要创建操作员重载函数的帮助。我尝试了2次,但被卡住了。
(感谢大家上次的帮助!我能够完全完成:])。
问题一:
运算符+(const Currency&rhs)将加上2美元的金额,但不会加上2美分的金额,尽管它会保留其中的1美分。因此,40.20 + 40.20 = 80.20(40美元和20美分分别输入为“ int”,出于可读性显示目的如上所述编写,抱歉!)
//删除减法
(如果删除了重载运算符,程序将正确添加/减去)。
问题2:
在我拥有int Dollars和int Cents之前,现在我只有\“ Amount \”。我猜我需要传递这两个,然后将它们加在一起作为一项成本[货币/金额],并以\“ Amount \”的形式返回并使用?*我不太确定,这是另一个原因\卡住了:(。
如果需要,我可以发布先前任务的原始公共成员。
我现在已经离开了上一个任务的公开成员的所有旧功能。
class Currency
{
private:
int Dollars;
int Cents;
//string Amount;
上市:
//构造函数
货币(int Dollars = 0,int Cents = 0);
朋友货币运算符+(货币,货币常量&);
//加法
// Get
int GetDollars();// Need to be removed
int GetCents();// Need to be removed
};
货币::货币(美元,国际分)
{
this-> Dollars = Dollars;
this-> Cents = Cents;
if(this->Cents >= 100)
{
this->Dollars += 1;
this->Cents -= 100;
}
}
货币运算符+(左货币,货币常量和右货币)
{
left.Dollars + = right.Dollars;
left.Cents + = right.Cents;
一会儿(左> 100分)
{
分数-= 100;
美元+ = 1;
}
返回左;
}
int货币:: GetDollars()
{
返回美元;
}
int货币:: GetCents()
{
返回美分;
}
int main()
{
int currDollars;
int currCents;
//char answer;
cout << \"Please enter a dollar amount\" << endl;
cin >> currDollars;
cout << \"Please enter a cents amount:\" << endl;
cin >> currCents;
// Creating and initalizing objects instances of Currency class
Currency payroll(currDollars,currCents);
Currency payroll2(currDollars,currCents);
Currency payroll3;
// Testing overloaded opertator+
payroll3 = payroll + payroll2;
// displaying test results
cout << \"Payroll3 Amount:$ \" << payroll3.GetDollars() << \".\"
<< payroll3.GetCents() << endl << endl;
return 0;
}
pre> code>
解决方法
好的,现在我们只有很少的代码可以实际查看,一些建议。首先,我认为我只有一个加法运算符:
Currency operator+(Currency const &c);
将其与右侧的美元和美分相加,然后返回结果。如果允许的话,最好使用全局运算符重载(大概这是家庭作业,因此您可能不会...):
Currency operator+(Currency left,Current const &right) {
left.Dollars += right.Dollars;
left.Cents += right.Cents;
while (left.Cents >= 100) {
left.Cents -= 100;
left.Dollars += 1;
}
return left;
}
请注意,这使用了一个小“ \“把戏\”-它通过值传递了左操作数,因此我们收到的\“ left \”是作为左操作数传递的值的副本。我们将修改并返回该对象。
我也只有一个构造函数,使用默认参数作为数量:
Currency(int dollars = 0,int cents = 0);
这样,如果您不指定金额,您将获得0.00美元,但是您可以指定美元(或美元和美分),而无需重复处理三个代码的代码。
通过将两者结合起来,您仍然可以执行诸如添加1
之类的操作,但是处理方式有所不同-与其直接使用带有单个int的operator+
,而是将int转换为Currency
使用ctor的对象,然后将该“ 9”对象添加到另一个对象中。您的代码变得更短,并且(尤其是)重复性大大降低。无需尝试测试/验证三个不同的加法运算符,您只需在一个地方处理一段代码即可。
我要添加到真实版本中的一件事在此处的精简版本中并不明显。我将上面的while
循环分离成一个单独的(私有)函数,名为normalize
或类似的东西,然后将其从operator+
和operator-
中使用(如果您添加operator*
和/或operator/
,可能也是如此)。
我还将消除GetCents
和GetDollars
成员,而是添加一个重载的operator<<
来直接处理Currency对象:
std::ostream &operator<<(std::ostream &os,Currency const &c) {
return os << c.Dollars << \".\"
<< std::setfill(\'0\') << std::setw(2) << std::setprecision(2)
<< c.Cents;
}
这样,您可以替换以下代码块:
cout << \"Current Amount is:$ \"
<< payroll.GetDollars()
<< \".\";
if(payroll.GetCents() < 10)
{cout << \"0\";}
else
cout
<< payroll.GetCents()
<< endl;
cout << endl;
内容更短,更易读:
cout << \"Current amount is: $\" << payroll << endl;
编辑:鉴于它只打算用于货币,您可以让Currency对象打印出$
本身。如果您想更详细一点,可以让它从语言环境中检索正确的货币代号和小数点分隔符。