2016-06-23 2 views
1

У меня проблема с перегруженным оператором, который, похоже, не работает правильно. Ниже приведен мой код.Проблема с перегруженным оператором C++

ACCOUNT.H

#ifndef SICT_ACCOUNT_H__ 
#define SICT_ACCOUNT_H__ 

#include <iostream> 

#define MAX_NAME 40 

namespace sict 
{ 
    class Account 
    { 
     char name_[MAX_NAME+1]; 
     double balance_; 
    public: 
     Account(); 
     Account(double); 
     Account(const char*, double = 0.0); 
     void display(bool = true) const; 
     Account& operator=(const Account&); 
     Account& operator+=(const Account&); 
     friend Account operator+(Account&, const Account&); 
    }; 
    std::ostream& operator<<(std::ostream& os, const Account& a); 
}; 

#endif 

ACCOUNT.CPP

#include <cstring> 
#include <iomanip> 
#include "Account.h" 

namespace sict 
{ 
    Account::Account() 
    { 
     name_[0] = '\0'; 
     balance_ = 0; 
    } 

    Account::Account(double balance) 
    { 
     name_[0] = '\0'; 
     balance_ = balance; 
    } 

    Account::Account(const char name[], double balance) 
    { 
     name_[MAX_NAME] = '\0'; 
     strncpy(name_, name, MAX_NAME); 
     balance_ = balance; 
    } 

    void Account::display(bool gotoNewline) const 
    { 
     std::cout << (name_[0] ? name_: "No Name") << ": $" << std::setprecision(2) << std::fixed << balance_; 
     if(gotoNewline) 
     { 
      std::cout << std::endl; 
     } 
    } 

    std::ostream& operator<<(std::ostream& os, const Account& a) 
    { 
     a.display(); 
     return os; 
    } 

    Account& Account::operator=(const Account& c) 
    { 
     balance_ = c.balance_; 
     name_[MAX_NAME] = '\0'; 
     strncpy(name_, c.name_, MAX_NAME); 

     return *this; 
    } 

    Account& Account::operator+=(const Account& b) 
    { 
     balance_ += b.balance_; 
     return *this; 
    } 

    Account operator+(Account& a, const Account& b) 
    { 
     return a.balance_ + b.balance_; 
    } 


} 

ГЛАВНАЯ

#include <iostream> 
#include "Account.h" 

using namespace sict; 

void displayABC(const Account& a, const Account& b, const Account& c) 
{ 
    std::cout << "A: " << a << std::endl << "B: " << b << std::endl 
    << "C: " << c << std::endl << "--------" << std::endl; 
} 

int main() 
{ 
    Account a; 
    Account b("Saving", 10000.99); 
    Account c("Checking", 100.99); 
    displayABC(a, b, c); 
    a = b + c; 
    displayABC(a, b, c); 
    a = "Joint"; 
    displayABC(a, b, c); 
    a = b += c; 
    displayABC(a, b, c); 
    a = b += c += 100.01; 
    displayABC(a, b, c); 

    return 0; 
} 

вывод, что я должен получить это

A: No Name: $0.00 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: No Name: $10101.98 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: Joint: $10101.98 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: Saving: $10101.98 
B: Saving: $10101.98 
C: Checking: $100.99 
-------- 
A: Saving: $10302.98 
B: Saving: $10302.98 
C: Checking: $201.00 

это то, что я получаю в настоящее время

A: No Name: $0.00 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: No Name: $10101.98 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: Joint: $0.00 
B: Saving: $10000.99 
C: Checking: $100.99 
-------- 
A: Saving: $10101.98 
B: Saving: $10101.98 
C: Checking: $100.99 
-------- 
A: Saving: $10302.98 
B: Saving: $10302.98 
C: Checking: $201.00 
-------- 

Как вы можете видеть целое значение равно 0 для отображения:

A: Соединение: $ 0,00.

Я не могу понять это. любая помощь приветствуется!

+0

'a =" Joint ";' Что должно произойти на этой линии? –

+0

, который использует оператор the = и добавляет имя «Joint» к текущему объекту. –

+0

@ a-one - ваш ответ на комментарий предполагает, что вы не выполнили реальной отладки. Вы должны были увидеть, что 'a' будет сброшен, как только эта строка будет выполнена. Тогда ваш вопрос был бы задан с более сфокусированной ситуацией, то есть «Почему мой объект сбрасывается при выполнении этой строки?», А не только «перегрузка не работает правильно». Отладка - это то, что вы должны научиться делать, поскольку это часть и способ обучения программированию. – PaulMcKenzie

ответ

0
a = "Joint"; 

фактически

a = Account("Joint"); 

так

a = Account("Joint", 0.0); 

так сбросить a баланс.

1
displayABC(a, b, c); 
a = b + c; 
displayABC(a, b, c); 
a = "Joint"; //The Problem!! 
displayABC(a, b, c); 
a = b += c; 
displayABC(a, b, c); 
a = b += c += 100.01; 
displayABC(a, b, c); 

Вы не определили конкретный operator= строковых объектов, и в результате, компилятор подставляя в конструкторе Account(const char name[], double balance = 0.0), что, поскольку нет никакого баланса указано, настройка баланса 0.

К конструктору следует добавить ключевое слово explicit, чтобы предотвратить его выполнение, или добавить дополнительную перегрузку, чтобы можно было установить имя без изменения баланса.

explicit Account::Account(const char name[], double balance) 
{ 
    name_[MAX_NAME] = '\0'; 
    strncpy(name_, name, MAX_NAME); 
    balance_ = balance; 
} 

Кстати, в C++ мира, вы должны заменить любые и все ссылки типа const char * с std::string, и хранить то же самое в ваших объектах. Единственный раз, когда вы должны использовать c-строку, - это если вы должны взаимодействовать с c-библиотекой.

+0

Он должен добавить 'explicit' в конструкторы, а не оператор присваивания. –

+0

Привет Я добавил явно и получил эту ошибку Account.cpp: 41: 18: error: expected unqualified-id Учетная запись и явная учетная запись :: operator = (const Account & c) –

+0

@ a-one @revolver_ocelot Я сделал редактирование. Я мог бы поклясться, что «явный» был действителен для перегрузок операторов, но, видимо, нет. – Xirema

0

Вы переписываете a, как вы сказали.

a = "Joint"; 

эквивалентно

a = Account("Joint"); 

, который создает новую учетную запись и использует оператор присваивания для присвоения вновь созданного Account для a.

Вы должны пометить свой конструктор как explicit и создать сеттер для имени учетной записи.

Смежные вопросы