brass.h,Brass为基本银行账户,主要实现输出客户的账户信息以及存取款功能,BrassPlus为在原有基本Brass基础上增加了贷款的功能模块,.h文件为该两种类的声明
#pragma once
#ifndef BRASS_H_
#define BRASS_H_
#include <string>
class Brass
{
private:
std::string fullName; //全名
long acctNum; //账户号
double balance; //余额
public:
Brass(const std::string& s = "Nullbody", const long an = -1, const double bal = 0.0);
void Deposit(double amt); //存款
virtual void Withdraw(double amt); //取款
double Balance() const; //提取余额
virtual void ViewAcct() const; //账户信息
virtual ~Brass() {};
};
/****************************************************************************/
class BrassPlus :public Brass//以Brass为基类的派生类
{
private:
double maxLoan; //最大贷款额度
double rate; //贷款利率
double owesBank; //欠款
public:
BrassPlus(const std::string& s = "Nullbody", const long an = -1,
const 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_H_
brass.cpp
为Brass和BrassPlus两个类中函数的定义
#include <iostream>
#include "brass.h"
using std::cout;
using std::endl;
using std::string;
typedef std::ios_base::fmtflags format;
typedef std::streamsize precis;
format setFormat();
void restore(format f, precis p);
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 isn't allowed;" << "deposit is cancelled.\n";
else
balance += amt;
}
void Brass::Withdraw(double amt)
{
format initialState = setFormat();
precis prec = cout.precision(2);
if (amt < 0)
cout << " Withdrawal ammount must be positive;"
<< "Withdrawal is cancelled.\n";
else if (amt <= balance)
balance -= amt;
else
cout << "Withdrawal ammount of $" << amt
<< " exceeds your balance.\n"
<< "Withdrawal is cancelled.\n";
restore(initialState, prec);
}
double Brass::Balance() const
{
format initialState = setFormat();
precis prec = cout.precision(2);
return balance;
}
void Brass::ViewAcct() const
{
format initialState = setFormat();
precis prec = cout.precision(2);
cout << "Client:" << fullName << endl;
cout << "Account number :" << acctNum << endl;
cout << "Balance :$" << balance << endl;
restore(initialState, prec);
}
/****************************************************************************/
BrassPlus::BrassPlus(const std::string& s , const long an ,
const 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), maxLoan(ml), owesBank(0.0), rate(r){}
void BrassPlus::ViewAcct() const
{
format initialState = setFormat();
precis prec = cout.precision(2);
Brass::ViewAcct();
cout << "Maximum loan: $" << maxLoan << endl;
cout << "Owed to bank: $" << owesBank << endl;
cout.precision(3);
cout << "Load rate :" << 100 * rate << "%\n";
restore(initialState, prec);
}
void BrassPlus::Withdraw(double amt)
{
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()
{
return cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
}
void restore(format f, precis p)
{
cout.setf(f, std::ios_base::floatfield);
cout.precision(2);
}