2016-06-23 5 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 

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


} 

MAIN ACCOUNT.CPP

#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:共同:$ 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: $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です。

私はこれを理解できないようです。どんな助けもありがとう!

+0

'a ="ジョイント ";'この行はどうなるでしょうか? –

+0

は、=演算子を使用し、現在のオブジェクトに "ジョイント"という名前を追加します。 –

+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=を定義していない、結果として、コンパイラは指定されていませんバランスはありませんので、0

にバランスを設定しているコンストラクタ Account(const char name[], double balance = 0.0)、に代入しています

コンストラクタにキーワードexplicitを追加して、それを防ぐか、追加のオーバーロードを追加して、残高を変更せずに名前を設定できるようにする必要があります。ところで

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

、C++の世界で、あなたはstd::stringとタイプconst char *の任意およびすべての参照を置き換える必要がありますし、あなたのオブジェクトに同じを格納します。 c-stringを使用する必要があるのは、c-libraryとのインタフェースが必要な場合だけです。

+0

彼は、assigment演算子ではなく、コンストラクタに 'explicit'を追加する必要があります。 –

+0

こんにちは私は、明示的な追加とAccount.cppこのエラーを得た:41:18:エラー:予想される修飾されていない-ID アカウント&明示的なアカウント::演算子=(constのアカウント&C) –

+0

私は編集をした@revolver_ocelot-1 @。私は、オペレータの過負荷に対して「明示的」が有効であったが、明らかにそうではないと宣言することができた。 – Xirema

0

あなたが言った通りにaを上書きしています。

a = "Joint"; 

は、新しいアカウントを作成し、新しく作成されたAccountaを割り当てる代入演算子を使用しています

a = Account("Joint"); 

に相当します。

コンストラクタにexplicitとマークし、アカウント名の設定を行う必要があります。

関連する問題