Домашнее задание - класс перегрузки оператора - застрял / потерян - PullRequest
1 голос
/ 02 мая 2011

Мне нужна помощь в создании перегруженных оператором функций, пожалуйста. Я попробовал 2, но я застрял. (Спасибо всем за вашу помощь в прошлый раз! Я смог полностью закончить:]).

Задача 1: Оператор + (const Currency & rhs) добавит суммы в 2 доллара, но не суммы в 2 цента, хотя удерживает центы от одной из них. Таким образом, 40,20 + 40,20 = 80,20 (40 долларов и 20 центов вводятся в отдельности как «int», записали его, как указано выше, для удобства чтения ... извините за путаницу!) // Убрал вычитание (Программа добавляет / вычитает правильно, если удалены операторы перегрузки).

Задача 2: Раньше у меня были int Dollars и int Cents, теперь у меня просто «Amount». Я предполагаю, что мне нужно передать эти два, и сложить их вместе как одну стоимость [Валюта / Сумма] и вернуть их как «Сумма» и использовать это? * Я не слишком уверен, еще одна причина, по которой я застрял: (.

При необходимости я могу публиковать оригинальных открытых участников из предыдущего назначения. На данный момент я оставил все старые функции открытых членов предыдущего назначения.


class Currency
{
private:</p>

<pre><code>int Dollars;
int Cents;
//string Amount;

общественность: // Конструктор Валюта (int Dollars = 0, int Cents = 0); Друг Валютный оператор + (Валюта, Валюта const &); // сложение

// Get
int GetDollars();// Need to be removed
int GetCents();// Need to be removed

};

Валюта :: Валюта (int Dollars, int Cents) { это-> Доллары = Доллары; это-> центы = центы;

if(this->Cents >= 100)
{
    this->Dollars += 1;
    this->Cents -= 100;
}

}

Валютный оператор + (Валюта слева, Валюта const & right) { left.Dollars + = right.Dollars; left.Cents + = right.Cents; while (left.Cents> = 100) { left.Cents - = 100; слева. Доллары + = 1; } вернуться налево; }

int Currency :: GetDollars () { вернуть доллары; }

int Currency :: 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;

}

1 Ответ

4 голосов
/ 02 мая 2011

Хорошо, теперь, когда у нас мало кода, на который можно реально посмотреть, несколько предложений.Во-первых, я думаю, что у меня будет только один оператор сложения:

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 распечатать саму $.Если вы хотите получить более подробную информацию, вы можете получить правильный указатель валюты и десятичный разделитель из локали.

...