我需要帮助创建运算符重载函数。我试过2但我被卡住了。 (谢谢你们上次的帮助!我完全完成了:])。
问题1: 运营商+(const Currency& rhs)将增加2美元的金额,但不会增加2美分的金额,尽管它保留了其中一个的美分。所以,40.20 + 40.20 = 80.20(40美元和20美分分别输入“int”,为了可读性显示的目的写了上面的内容...抱歉混淆!) //删除了减法 (如果删除了重载运算符,程序会正确地添加/减去。)
问题2: 在我获得美元和英镑之前,现在我只有“金额”。我猜我需要传递这两个,并将它们作为一个成本[货币/金额]加在一起并将它们作为“金额”返回并使用它?*我不太确定,另一个原因是我被卡住了: (
如果需要,我可以发布以前作业中的原始公共成员。 我现在离开了上一个任务的公共成员的所有旧功能。
class Currency
{
private:
int Dollars;
int Cents;
//string Amount;
public:
// Constructor
Currency(int Dollars = 0, int Cents = 0);
friend Currency operator+(Currency, Currency const &);
// Addition
// Get
int GetDollars();// Need to be removed
int GetCents();// Need to be removed
};
Currency::Currency(int Dollars, int Cents)
{
this->Dollars = Dollars;
this->Cents = Cents;
if(this->Cents >= 100)
{
this->Dollars += 1;
this->Cents -= 100;
}
}
Currency operator+(Currency left, Currency const &right)
{
left.Dollars += right.Dollars;
left.Cents += right.Cents;
while (left.Cents >= 100)
{
left.Cents -= 100;
left.Dollars += 1;
}
return left;
}
int Currency::GetDollars()
{
return Dollars;
}
int Currency::GetCents()
{
return Cents;
}
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>
答案 0 :(得分:4)
好的,现在我们没有足够的代码来真正看一下,一些建议。首先,我认为我只有一个加法运算符:
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;
}
请注意,这会使用一些&#34;技巧&#34; - 它的左操作数是按值传递的,所以&#34; left&#34;我们收到的是作为左操作数传递的值的副本。我们修改并返回该对象。
我也只有一个构造函数,使用默认参数:
Currency(int dollars = 0, int cents = 0);
这样一来,如果你没有指定金额,你可以得到0.00美元,但你可以指定美元,或美元和美分,而不需要三个代码重复来处理这三种可能性。
通过结合其中两个,您仍然可以执行添加1
之类的操作,但处理方式略有不同 - 而不是直接使用只需要一个operator+
的{{1}} int,它接受int并使用ctor将其转换为Currency
对象,然后将Currency
对象添加到另一个对象。您的代码变得更短,并且(特别是)重复性更低。您没有尝试测试/验证三个不同的加法运算符,而是只在一个地方处理一段代码。
有一件事我会添加到真实版本中,在这里的精简版中并不明显。我将上面的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对象打印出$
本身。如果你想要更精细,你可以让它从区域设置中检索正确的货币代码和小数分隔符。