Я довольно новичок в C ++ и начинаю свой основной университетский проект. Пока все идет хорошо, но я столкнулся с этой проблемой, и после нескольких часов поиска в Интернете я все еще не в курсе.

Проблема возникает в Portfolio::displayAccounts(), когда я пытаюсь перебрать вектор, чтобы отобразить каждый элемент внутри вектора.

Это не позволит мне использовать типичный std::cout <<, который я всегда использовал для таких вещей, как массивы.

Любая помощь будет оценена.

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


class Portfolio
{
private:
    std::vector<Account> accounts;

public:
    double calculateNetWorth();
    Portfolio();
    void addAccount(std::string name, double balance);
    void displayAccounts();
};
#include "Account.h"

double Account::getBalance() {
    return balance;
}

Account::Account(std::string name, double balance){
    this->name = name;
    this->balance = balance;
}
#include <string>
class Account
{
private:
    std::string name;
    double balance;
public: 
    double getBalance();
    Account(std::string name, double balance);
};
#include <iostream>
#include <string>

double Portfolio::calculateNetWorth() {
    double total = 0;
    for (auto& account : accounts) {
        total += account.getBalance();
    }
    return total;
}

Portfolio::Portfolio() {    

}

void Portfolio::addAccount(std::string name, double balance) {
    std::cout << "Account Name: ";
    std::cin >> name;
    std::cout << "Account Balance: ";
    std::cin >> balance;
    Account account = Account(name, balance);
    accounts.push_back(account);
}


void Portfolio::displayAccounts() {
    std::cout << "nThe vector elements after push back are: ";
    for (int i = 0; i < accounts.size(); i++) {
        std::cout << accounts[i] << " ";
    }    
}
c++
1
BenHarv97 28 Фев 2020 в 20:25

2 ответа

Лучший ответ

Стандартная библиотека не знает, как должен выводиться экземпляр вашего класса Account. Чтобы иметь возможность написать что-то вроде этого:

std::cout << some_account;

Вам нужно перегрузить оператор <<, например, так:

class Account
{
private:
  std::string name;
  double balance;
public:
  double getBalance();
  Account(std::string name, double balance);

  // add this so the overloaded << operator can access your private members
  friend std::ostream& operator<<(std::ostream& os, const Account& o);
};

// Implementation

std::ostream& operator<<(std::ostream& os, const Account& a)
{
  os << "Name: " << a.name << "  Balance: " << a.balance << "\n";
  return os;
}

Напечатает что-то вроде этого для экземпляра Account:

Name: SomeName Balance: 123.45678

< Сильный > Бонус :

Если вы используете C ++ 11, вы можете написать это:

  for (auto & account : accounts)
    std::cout << account << " ";

Вместо:

  for (int i = 0; i < accounts.size(); i++) {
    std::cout << accounts[i] << " ";
4
Konrad Rudolph 28 Фев 2020 в 23:35

Вы пытаетесь напечатать accounts[i], который имеет тип Account. Поскольку у вашего объекта нет перегруженного оператора <<, вы не сможете ничего напечатать.
Есть 2 решения:

  1. Перегрузить оператор <<
  2. Напечатайте скорее name или balance атрибуты вашего класса
3
cocool97 28 Фев 2020 в 17:30