- // brass.h -- bank account classes
- #ifndef BRASS_H_
- #define BRASS_H_
- #include <string>
- // Brass Account Class
- class Brass
- {
- private:
- std::string fullName;
- long acctNum;
- double balance;
- public:
- Brass(const std::string & s = "Nullbody", long an = -1,
- double bal = 0.0);
- void Deposit(double amt);
- virtual void Withdraw(double amt);
- double Balance() const;
- virtual void ViewAcct() const;
- virtual ~Brass() {}
- };
- //Brass Plus Account Class
- class BrassPlus : public Brass
- {
- private:
- double maxLoan;
- double rate;
- double owesBank;
- public:
- BrassPlus(const std::string & s = "Nullbody", long an = -1,
- double bal = 0.0, double ml = 500,
- double r = 0.11125);
- BrassPlus(const Brass & ba, double ml = 500,
- double r = 0.11125);
- virtual void ViewAcct()const;
- virtual void Withdraw(double amt);
- void ResetMax(double m) { maxLoan = m; }
- void ResetRate(double r) { rate = r; };
- void ResetOwes() { owesBank = 0; }
- };
- #endif
- // brass.cpp -- bank account class methods
- #include <iostream>
- #include "brass.h"
- using std::cout;
- using std::endl;
- using std::string;
- // formatting stuff
- typedef std::ios_base::fmtflags format;
- typedef std::streamsize precis;
- format setFormat();
- void restore(format f, precis p);
- // Brass methods
- Brass::Brass(const string & s, long an, double bal)
- {
- fullName = s;
- acctNum = an;
- balance = bal;
- }
- void Brass::Deposit(double amt)
- {
- if (amt < 0)
- cout << "Negative deposit not allowed; "
- << "deposit is cancelled.\n";
- else
- balance += amt;
- }
- void Brass::Withdraw(double amt)
- {
- // set up ###.## format
- format initialState = setFormat();
- precis prec = cout.precision(2);
- if (amt < 0)
- cout << "Withdrawal amount must be positive; "
- << "withdrawal canceled.\n";
- else if (amt <= balance)
- balance -= amt;
- else
- cout << "Withdrawal amount of $" << amt
- << " exceeds your balance.\n"
- << "Withdrawal canceled.\n";
- restore(initialState, prec);
- }
- double Brass::Balance() const
- {
- return balance;
- }
- void Brass::ViewAcct() const
- {
- // set up ###.## format
- format initialState = setFormat();
- precis prec = cout.precision(2);
- cout << "Client: " << fullName << endl;
- cout << "Account Number: " << acctNum << endl;
- cout << "Balance: $" << balance << endl;
- restore(initialState, prec); // Restore original format
- }
- // BrassPlus Methods
- BrassPlus::BrassPlus(const string & s, long an, double bal,
- double ml, double r) : Brass(s, an, bal)
- {
- maxLoan = ml;
- owesBank = 0.0;
- rate = r;
- }
- BrassPlus::BrassPlus(const Brass & ba, double ml, double r)
- : Brass(ba) // uses implicit copy constructor
- {
- maxLoan = ml;
- owesBank = 0.0;
- rate = r;
- }
- // redefine how ViewAcct() works
- void BrassPlus::ViewAcct() const
- {
- // set up ###.## format
- format initialState = setFormat();
- precis prec = cout.precision(2);
- Brass::ViewAcct(); // display base portion
- cout << "Maximum loan: $" << maxLoan << endl;
- cout << "Owed to bank: $" << owesBank << endl;
- cout.precision(3); // ###.### format
- cout << "Loan Rate: " << 100 * rate << "%\n";
- restore(initialState, prec);
- }
- // redefine how Withdraw() works
- void BrassPlus::Withdraw(double amt)
- {
- // set up ###.## format
- format initialState = setFormat();
- precis prec = cout.precision(2);
- double bal = Balance();
- if (amt <= bal)
- Brass::Withdraw(amt);
- else if ( amt <= bal + maxLoan - owesBank)
- {
- double advance = amt - bal;
- owesBank += advance * (1.0 + rate);
- cout << "Bank advance: $" << advance << endl;
- cout << "Finance charge: $" << advance * rate << endl;
- Deposit(advance);
- Brass::Withdraw(amt);
- }
- else
- cout << "Credit limit exceeded. Transaction cancelled.\n";
- restore(initialState, prec);
- }
- format setFormat()
- {
- // set up ###.## format
- return cout.setf(std::ios_base::fixed,
- std::ios_base::floatfield);
- }
- // usebrass2.cpp -- polymorphic example
- // compile with brass.cpp
- #include <iostream>
- #include <string>
- #include "brass.h"
- const int CLIENTS = 4;
- int main()
- {
- using std::cin;
- using std::cout;
- using std::endl;
- Brass * p_clients[CLIENTS];
- std::string temp;
- long tempnum;
- double tempbal;
- char kind;
- for (int i = 0; i < CLIENTS; i++)
- {
- cout << "Enter client's name: ";
- getline(cin,temp);
- cout << "Enter client's account number: ";
- cin >> tempnum;
- cout << "Enter opening balance: $";
- cin >> tempbal;
- cout << "Enter 1 for Brass Account or "
- << "2 for BrassPlus Account: ";
- while (cin >> kind && (kind != '1' && kind != '2'))
- cout <<"Enter either 1 or 2: ";
- if (kind == '1')
- p_clients[i] = new Brass(temp, tempnum, tempbal);
- else
- {
- double tmax, trate;
- cout << "Enter the overdraft limit: $";
- cin >> tmax;
- cout << "Enter the interest rate "
- << "as a decimal fraction: ";
- cin >> trate;
- p_clients[i] = new BrassPlus(temp, tempnum, tempbal,
- tmax, trate);
- }
- while (cin.get() != '\n')
- continue;
- }
- cout << endl;
- for (int i = 0; i < CLIENTS; i++)
- {
- p_clients[i]->ViewAcct();
- cout << endl;
- }
- for (int i = 0; i < CLIENTS; i++)
- {
- delete p_clients[i]; // free memory
- }
- cout << "Done.\n";
- /* code to keep window open
- if (!cin)
- cin.clear();
- while (cin.get() != '\n')
- continue;
- */
- return 0;
- }