Хорошо, теперь, когда у нас мало кода, на который можно реально посмотреть, несколько предложений.Во-первых, я думаю, что у меня будет только один оператор сложения:
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
, но он обрабатывается немного по-другому - вместо непосредственного использования operator+
, который принимает один int, он берет int и преобразует его в Currency
объект, используя ctor, затем добавляет этот объект Currency
кДругой.Ваш код становится намного короче и (в частности) намного менее повторяющимся.Вместо того, чтобы пытаться протестировать / проверять три разных оператора сложения, у вас есть только один кусок кода в одном месте, с которым нужно иметь дело.
Есть одна вещь, которую я бы добавил к реальной версии, которая неочевидна при удалениивниз версия здесь.Я бы выделил вышеприведенный цикл while
в отдельную (приватную) функцию с именем normalize
или что-то в этом роде, которая затем будет использоваться как из operator+
, так и operator-
(и если вы добавите * 1026)* и / или 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 распечатать саму $
.Если вы хотите получить более подробную информацию, вы можете получить правильный указатель валюты и десятичный разделитель из локали.