使用Account类层次结构的多态的银行系统程序

使用Account类层次结构的多态的银行系统程序

使用创建过的Account类层次结构开发一个具有多态性的银行系统程序
创建过的类的链接

创建一个Account指针的vector对象,其中的指针指向SavingAccount对象和CheckingAccount对象。对于该vector对象中的每个Account,允许用户使用成员函数debit指定要从该Account取出的货币的金额,并允许用户使用成员函数credit指定要存入该Account的货币金额。处理每个Account时,应判定它的类型。如果Account是SavingAccount,就使用成员函数calculateInterest计算该Account应该得到的利息,然后使用成员函数credit把利息加到账户余额上。处理完一个Account后,通过调用基类成员函数getBalance打印更新后的账户余额。

完整代码

// Lab 1: Account.h
// Definition of Account class.
#ifndef ACCOUNT_H
#define ACCOUNT_H

class Account
{
public:
   Account( double );      // constructor initializes balance
   virtual void credit( double );      // add an amount to the account balance
   virtual bool debit( double );      // subtract an amount from the balance
   void setBalance( double );      // sets the account balance
   double getBalance();      // return the account balance
private:
   double balance;     // data member that stores the balance
};      // end class Account

#endif

// Lab 1: Account.cpp
// Member-function definitions for class Account.
#include <iostream>
using std::cout;
using std::endl;

#include "Account.h"      // include definition of class Account

// Account constructor initializes data member balance
Account::Account( double initialBalance )
{
        // if initialBalance is greater than or equal to 0.0, set this value
        // as the balance of the Account
   if ( initialBalance >= 0.0 )
      balance = initialBalance;
   else      // otherwise, output message and set balance to 0.0
   {
      cout << "Error: Initial balance cannot be negative." << endl;
      balance = 0.0;
   }      // end if...else
} // end Account constructor

// credit (add) an amount to the account balance
void Account::credit( double amount )
{
   balance = balance + amount;      // add amount to balance
} // end function credit

// debit (subtract) an amount from the account balance
// return bool indicating whether money was debited
bool Account::debit( double amount )
{
   if ( amount > balance )      // debit amount exceeds balance
   {
      cout << "Debit amount exceeded account balance." << endl;
      return false;
   }      // end if
   else      // debit amount does not exceed balance
   {
      balance = balance - amount;
      return true;
   }      // end else
} // end function debit

// set the account balance
void Account::setBalance( double newBalance )
{
   balance = newBalance;
} // end function setBalance

// return the account balance
double Account::getBalance()
{
   return balance;
} // end function getBalance
// Lab 1: SavingsAccount.h
// Definition of SavingsAccount class.
#ifndef SAVINGS_H
#define SAVINGS_H

#include "Account.h"      // Account class definition

class SavingsAccount : public Account
{
public:
   // constructor initializes balance and interest rate
   SavingsAccount( double, double );

   double calculateInterest();      // determine interest owed
private:
   double interestRate;      // interest rate (percentage) earned by account
}; // end class SavingsAccount

#endif
// Lab 1: SavingsAccount.cpp
// Member-function definitions for class SavingsAccount.
#include "SavingsAccount.h"      // SavingsAccount class definition

// constructor initializes balance and interest rate
SavingsAccount::SavingsAccount( double initialBalance, double rate )
   : Account( initialBalance )      // initialize base class
{
   interestRate = ( rate < 0.0 ) ? 0.0 : rate;      // set interestRate
} // end SavingsAccount constructor

// return the amount of interest earned
double SavingsAccount::calculateInterest()
{
   return getBalance() * interestRate;
} // end function calculateInterest


// Lab 1: CheckingAccount.h
// Definition of CheckingAccount class.
#ifndef CHECKING_H
#define CHECKING_H

#include "Account.h"      // Account class definition

class CheckingAccount : public Account
{
public:
   // constructor initializes balance and transaction fee
    CheckingAccount( double, double );
    virtual void credit( double );      // redefined credit function
    virtual bool debit( double );      // redefined debit function
private:
   double transactionFee;      // fee charged per transaction

   // utility function to charge fee
   void chargeFee();
}; // end class CheckingAccount

#endif
// Lab 1: CheckingAccount.cpp
// Member-function definitions for class CheckingAccount.
#include <iostream>
using std::cout;
using std::endl;

#include "CheckingAccount.h"      // CheckingAccount class definition

// constructor initializes balance and transaction fee
CheckingAccount::CheckingAccount( double initialBalance, double fee )
   : Account( initialBalance )      // initialize base class
{
   transactionFee = ( fee < 0.0 ) ? 0.0 : fee;      // set transaction fee
} // end CheckingAccount constructor

// credit (add) an amount to the account balance and charge fee
void CheckingAccount::credit( double amount )
{
   Account::credit( amount );      // always succeeds
   chargeFee();
} // end function credit

// debit (subtract) an amount from the account balance and charge fee
bool CheckingAccount::debit( double amount )
{
   bool success = Account::debit( amount );      // attempt to debit

   if ( success )      // if money was debited, charge fee and return true
   {
      chargeFee();
      return true;
   }      // end if
   else      // otherwise, do not charge fee and return false
      return false;
} // end function debit

// subtract transaction fee
void CheckingAccount::chargeFee()
{
   Account::setBalance( getBalance() - transactionFee );
   cout << "$" << transactionFee << " transaction fee charged." << endl;
} // end function chargeFee
// Lab 1: polymorphicBanking.cpp
// Processing Accounts polymorphically.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip>
using std::setprecision;
using std::fixed;

#include <vector>
using std::vector;

#include "Account.h"      // Account class definition
#include "SavingsAccount.h"      // SavingsAccount class definition
#include "CheckingAccount.h"      // CheckingAccount class definition

int main()
{
   // create vector accounts
   vector < Account * > accounts( 4 );

   // initialize vector with Accounts
   accounts[ 0 ] = new SavingsAccount( 25.0, .03 );
   accounts[ 1 ] = new CheckingAccount( 80.0, 1.0 );
   accounts[ 2 ] = new SavingsAccount( 200.0, .015 );
   accounts[ 3 ] = new CheckingAccount( 400.0, .5 );

   cout << fixed << setprecision( 2 );

   // loop through vector, prompting user for debit and credit amounts
   for ( size_t i = 0; i < accounts.size(); i++ )
   {
      cout << "Account " << i + 1 << " balance: $"
         << accounts[ i ]->getBalance();      // Call the getBalance function through Account pointer i

      double withdrawalAmount = 0.0;
      cout << "\nEnter an amount to withdraw from Account " << i + 1
         << ": ";
      cin >> withdrawalAmount;
     accounts[ i ]->debit( withdrawalAmount );      //the debit function through Account pointer i

      double depositAmount = 0.0;
      cout << "Enter an amount to deposit into Account " << i + 1
         << ": ";
      cin >> depositAmount;
       accounts[ i ]->credit( depositAmount );      //the credit function through Account pointer i

      // downcast pointer
      SavingsAccount *savingsAccountPtr =
           dynamic_cast < SavingsAccount * > ( accounts[ i ] );

      // if Account is a SavingsAccount, calculate and add interest
      if ( savingsAccountPtr != 0  )      //a test to determine if savingsAccountPtr isn't 0
      {
         double interestEarned =  savingsAccountPtr->calculateInterest();      //member function calculateInterestthrough savingsAccountPtr
         cout << "Adding $" << interestEarned << " interest to Account "
            << i + 1 << " (a SavingsAccount)" << endl;
      savingsAccountPtr->credit( interestEarned );      //Use the credit function to credit interestEarned to the SavingsAccount pointed to by savingsAccountPtr
      } // end if

      cout << "Updated Account " << i + 1 << " balance: $"
         << accounts[ i ]->getBalance()      //the getBalance function through Account pointer i
		 << "\n\n";
   } // end for

   return 0;
} // end main

测试结果
使用Account类层次结构的多态的银行系统程序

上一篇:【cf1243E】E. Sum Balance(状压dp)


下一篇:负载均衡工具 haproxy 单机安装部署完整流程