作业-运算符重载货币类-卡住/丢失

问题描述

|| 我需要创建操作员重载函数的帮助。我尝试了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;
}     

解决方法

好的,现在我们只有很少的代码可以实际查看,一些建议。首先,我认为我只有一个加法运算符:
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对象打印出
$
本身。如果您想更详细一点,可以让它从语言环境中检索正确的货币代号和小数点分隔符。