【问题标题】:Homework - Operator-Overloading Currency Class - Stuck/Lost作业 - 运算符重载货币类 - 卡住/丢失
【发布时间】:2011-08-16 17:52:15
【问题描述】:

请帮助我创建运算符重载函数。我尝试了 2,但我被卡住了。 (谢谢大家上次的帮助!我已经完全完成了:])。

问题 1: operator+(const Currency &rhs) 将添加 2 美元的金额,但不会添加 2 美分的金额,尽管它会保留其中之一的美分。因此,40.20 + 40.20 = 80.20(40 美元和 20 美分分别输入为“int”,为了便于阅读,请按上述方式写...抱歉造成混淆!) // 去掉减法 (如果重载运算符被删除,程序会正确加/减)。

问题 2: 在我有 int Dollars 和 int Cents 之前,现在我只有“金额”。我猜我需要传入这两个,并将它们加在一起作为一个成本 [货币/金额] 并将它们作为“金额”返回并使用它?*我不太确定,另一个我被卡住的原因: (。

如果需要,我可以发布以前分配的原始公共成员。 我暂时保留了之前分配的公共成员的所有旧功能。


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>

【问题讨论】:

  • @Riotson:代码太大,任何人都无法遵循,请删除不相关的部分并在您遇到问题的地方发布一个简单的代码。
  • 抱歉,马上就做!
  • 希望更好,如果不让我知道,我会尽量减少它!
  • @Riotson:如果你看到有机会减少它,那就去做吧! Makie it minimilistic,你会注意到它可以帮助人们更好更快地帮助你,并节省每个人的努力。
  • 我想我会尝试将它简化为一个具有单个重载运算符(会出现问题)和 main 的类,它只是创建一个对象,使用重载运算符,并且(例如)打印出结果来显示问题。

标签: c++ class operator-overloading currency


【解决方案1】:

好的,既然我们的代码足够少,可以真正查看一下,还有一些建议。首先,我想我只有 one 加法运算符:

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;
}

请注意,这使用了一个小“技巧”​​——它的左操作数按值传递,因此我们收到的“左”是作为左操作数传递的值的副本。然后我们修改并返回该对象。

我也只有一个构造函数,使用金额的默认参数:

Currency(int dollars = 0, int cents = 0);

这样,如果您不指定金额,您将获得 0.00 美元,但您可以指定美元或美元和美分,无需三个重复的代码来处理这三种可能性。

通过结合这两者,您仍然可以执行添加 1 之类的操作,但处理方式略有不同——而不是直接使用采用单个 int 的 operator+,它采用 int 并转换使用 ctor 将它添加到 Currency 对象,然后将 Currency 对象添加到另一个对象。您的代码变得更短,并且(特别是)重复性更少。无需尝试测试/验证三个不同的加法运算符,您只需在一个地方处理一段代码。

我要添加到真实版本中的一件事在此处的精简版中并不明显。我会将上面的 while 循环分离成一个名为 normalize 或类似名称的单独(私有)函数,然后将在 operator+operator- 中使用它(如果你添加一个 @987654332 @ 和/或 operator/,也可能是它们)。

我还会删除 GetCentsGetDollars 成员,而是添加一个重载的 operator&lt;&lt; 来直接处理 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 对象打印出 $ 本身。如果您想要更详细,您可以让它从语言环境中检索正确的货币指示符和小数分隔符。

【讨论】:

  • @Jerry Coffin :我一定做错了,我做了你说的一切(完成并完成了构造函数部分),它在“货币运算符+(剩余货币,当前常量)中告诉我&right)”,即“美元”和“美分”是不可访问的。对不起,如果这是我想念的简单的东西……因为死记硬背而很累。 (我还去了我有 payroll3= payroll + payroll2; 它说“+”匹配多个操作数......我不知道如何,我删除了除了您键入的代码之外的所有内容更少的代码,并且只使用你推荐的一个加法运算符)。
  • 对不起——我应该提到如果你创建一个全局重载,你需要将它声明为类的朋友:friend Currrency operator+(Currency, Currency const &amp;);
  • @Jerry Coffin:啊,谢谢!那部分现在可以工作了:]。我的下一个问题是......我如何将 currDollars 和 currCents 传递给“工资单”对象?每当我尝试时,它都会给我一个错误,告诉我“ error LNK2001: unresolved external symbol "public: __thiscall Currency::Currency(int,int)" (??0Currency@@QAE@HH@Z):"
  • 感谢您花时间写下所有这些并帮助我!我很感激!!!我还更新了我的代码...我从未使用过全局变量,所以希望我拿出了所有正确的东西。
  • 我在上面包含了 ctor 的声明,但没有包含它的实现(因为这是家庭作业,我想留一点让您弄清楚/处理)。不过应该很简单,只需根据您传入的内容初始化 Dollars 和 Cents...
猜你喜欢
  • 2014-07-10
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多