#include #include #include #include using namespace std; class account { string nm; long bal; // balance is in pennies (or smaller) public: // account(string n) : nm(n), bal(0) {} account(string n, long initial_bal = 0) : nm(n), bal(initial_bal) { // check the invariant! if (nm == "" || bal < 0) throw runtime_error("account(): invalid parameters"); } string name() const { return nm; } long balance() const { return bal; } long deposit(long amount) { // can also do withdraw // check the invariant! account tmp(nm, bal+amount); bal = tmp.bal; return bal; } long withdraw(long amount) { return deposit(-amount); // re-use code, don't copy-paste!!! } }; class bank { vector bank_accounts; public: void add_account(const account &acct) { bank_accounts.push_back(acct); } void print_accounts() const { // Bad: Calls size in each loop iteration. // for (int i = 0; i < bank_accounts.size(); i++) { // Good: calls size() only once! for (int i = 0, sz = bank_accounts.size(); i < sz; i++) { const account &acct = bank_accounts[i]; cout << acct.name() << ": " << acct.balance() << '\n'; } } void deposit(string nm, long amount) { for (int i = 0, sz = bank_accounts.size(); i < sz; i++) if (bank_accounts[i].name() == nm) bank_accounts[i].deposit(amount); } void withdraw(string nm, long amount) { deposit(nm, -amount); } void add_interest(long rate) { for (int i = 0, sz = bank_accounts.size(); i < sz; i++) { account &acct = bank_accounts[i]; acct.deposit(acct.balance() * rate / 100); } } }; int main() { bank rbs; account mickey("Mickey Mouse"); account donald("Donald Duck", 30); rbs.add_account(mickey); rbs.add_account(donald); rbs.add_account(account("Pluto", 10000)); rbs.print_accounts(); rbs.deposit("Mickey Mouse", 10); rbs.withdraw("Donald Duck", 10); rbs.print_accounts(); rbs.add_interest(25); rbs.print_accounts(); rbs.add_interest(-500); // blow up rbs.print_accounts(); return 0; }