使自定义类ostream可输出?

时间:2014-04-14 15:16:48

标签: c++ operator-overloading ostream

我试图从支票和储蓄帐户打印余额。我知道你不能使用void函数返回一个值,但是我可以用哪种方式显示两个帐户的余额?

#ifndef ACCOUNT_H
#define ACCOUNT_H

// Account.h
// 4/8/14
// description

class Account {
private:
    double balance;
    double interest_rate; // for example, interest_rate = 6 means 6%
public:
    Account();
    Account(double);
    void deposit(double);
    bool withdraw(double); // returns true if there was enough money, otherwise false
    double query();
    void set_interest_rate(double rate);
    double get_interest_rate();
    void add_interest();
};

#endif


// Bank.cpp
// 4/12/14
// description

#include <iostream>
#include <string>
#include "Bank.h"

using namespace std;

Bank::Bank(): checking(0), savings(0) { }

Bank::Bank(double checking_amount, double savings_amount): checking(checking_amount), savings(savings_amount){;

    checking = Account(checking_amount);
    savings = Account(savings_amount);
}

void Bank::deposit(double amount, string account)
{
    if (account == "S") {
        savings.deposit(amount);
    } if (account == "C") {
        checking.deposit(amount);
    }
}

void Bank::withdraw(double amount, string account)
{
    if (account == "S") {
        savings.withdraw(amount);
    } if (account == "C") {
        checking.withdraw(amount);
    }
}

void Bank::transfer(double amount, string account)
{
    if (account == "S") {
        savings.deposit(amount);
        checking.withdraw(amount);
    } if (account == "C") {
        checking.deposit(amount);
        savings.withdraw(amount);
    }
}

void Bank::print_balances()
{
    cout << savings << endl;
    cout << checking << endl;

}

#ifndef BANK_H
#define BANK_H

// Bank.h
// 4/12/14
// description

#include <string>

#include "Account.h"

using namespace std;

class Bank {
private:
    Account checking;
    Account savings;
public:
    Bank();
    Bank(double savings_amount, double checking_amount);
    void deposit(double amount, string account);
    void withdraw(double amount, string account);
    void transfer(double amount, string account);
    void print_balances();
};

#endif

我在void Bank :: print_balances()下遇到2个错误。它只是说:

"no match for 'operator<<' in 'std::cout << ((Bank*)this) ->Bank::savings'"

我正在阅读很多关于它的内容,但我所学到的只是&#34;检查&#34;和&#34;储蓄&#34;是帐户类型,它不会工作。我以前的项目相似,而且我有&#34; double&#34;而不是类型,所以我能够返回一个值。

如果格式错误,请注意。第一次在这个网站上发帖。

4 个答案:

答案 0 :(得分:3)

您需要为自定义类operator<<重载Account,才能cout<<其对象。

class Account {
    ...
public:
    friend ostream& operator<<(ostream &os, const Account &dt);
    ...
};

ostream& operator<<(ostream &os, const Account &dt)
{
    os << dt.balance; // print its balance
    return os;
}

要继续阅读,请查看Overloading the I/O operators

答案 1 :(得分:2)

查看此页面:Overloading the << Operator for your own class。它说明了如何让cout以您想要的方式打印您的课程。

答案 2 :(得分:2)

  1. 你没有在Bank::print_balances()中返回任何内容(你不能,因为它是void函数)
  2. 您现在正在做的是将savingscheckingAccount类型)传递给std::cout作为operator<<()
  3. 的参数
  4. 问题是,默认情况下,std::cout&#34;知道&#34;如何仅输出基本类型(例如intfloatdouble等)和一些C ++标准库类型(例如std::string)。
  5. 因此,您有两种选择:

    • 通过getter输出从Account个对象获得的基元类型:

      class Account {
            ...
            double GetBalance() const { return balance; }
            ...
      };
      
      void Bank::print_balances()
      {
           std::cout << savings.GetBalance();
           ...
      
    • 或通过重载std::cout告诉Account如何打印operator<<()个对象(如其他答案中所述)。

      std::ostream& operator<<(std::ostream& os, const Account& a)
      {
          os << a.GetBalance();
          return os;
      }
      
  6. 您永远不会想要将金额存储在浮点变量中! (只有当你每次做总数或乘以时都不同意放弃一些硬币时)

答案 3 :(得分:1)

你没有超载“&lt;&lt;”您的帐户类中的运算符。 编译器不知道cout的方法和内容,你应该重载Account类的插入操作符。