作业 - 操作员重载货币类 - 被困/丢失

时间:2011-05-02 04:31:07

标签: c++ class operator-overloading currency

我需要帮助创建运算符重载函数。我试过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>

1 个答案:

答案 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/,可能也会添加{。}}。

我还删除了GetCentsGetDollars成员,而是添加了一个重载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对象打印出$本身。如果你想要更精细,你可以让它从区域设置中检索正确的货币代码和小数分隔符。