Main Page

Previous Page
Next Page

[Page 1313 (continued)]

G.12. Class Deposit

Class Deposit (Figs. G.21G.22) derives from TRansaction and represents a deposit ATM transaction. Figure G.21 contains the Deposit class definition. Like derived classes BalanceInquiry and Withdrawal, Deposit declares a constructor (line 13) and member function execute (line 14)we discuss these momentarily. Recall from the class diagram of Fig. 13.29 that class Deposit has one attribute amount, which line 16 implements as an int data member. Lines 1718 create reference data members keypad and depositSlot that implement the associations between class Deposit and classes Keypad and DepositSlot modeled in Fig. 13.28. Line 19 contains the function prototype for a private utility function promptForDepositAmount that we will discuss shortly.

Figure G.21. Deposit class definition.

 1  // Deposit.h
 2  // Deposit class definition. Represents a deposit transaction.
 3  #ifndef DEPOSIT_H
 4  #define DEPOSIT_H
 6  #include "Transaction.h" // Transaction class definition
 7  class Keypad; // forward declaration of class Keypad
 8  class DepositSlot; // forward declaration of class DepositSlot
10  class Deposit : public Transaction
11  {
12  public:
13     Deposit( int, Screen &, BankDatabase &, Keypad &, DepositSlot & );
14     virtual void execute(); // perform the transaction
15  private:
16     double amount; // amount to deposit
17     Keypad &keypad; // reference to ATM's keypad
18     DepositSlot &depositSlot; // reference to ATM's deposit slot
19     double promptForDepositAmount() const; // get deposit amount from user
20  }; // end class Deposit
22  #endif // DEPOSIT_H

Figure G.22. Deposit class member-function definitions.
(This item is displayed on pages 1314 - 1315 in the print version)

 1  // Deposit.cpp
 2  // Member-function definitions for class Deposit.
 3  #include "Deposit.h" // Deposit class definition
 4  #include "Screen.h" // Screen class definition
 5  #include "BankDatabase.h" // BankDatabase class definition
 6  #include "Keypad.h" // Keypad class definition
 7  #include "DepositSlot.h" // DepositSlot class definition
 9  const static int CANCELED = 0; // constant representing cancel option
11  // Deposit constructor initializes class's data members
12  Deposit::Deposit( int userAccountNumber, Screen &atmScreen,
13     BankDatabase &atmBankDatabase, Keypad &atmKeypad,
14     DepositSlot &atmDepositSlot )
15     : Transaction( userAccountNumber, atmScreen, atmBankDatabase ),
16       keypad( atmKeypad ), depositSlot( atmDepositSlot )
17  {
18     // empty body
19  } // end Deposit constructor
21  // performs transaction; overrides Transaction's pure virtual function
22  void Deposit::execute()
23  {
24     BankDatabase &bankDatabase = getBankDatabase(); // get reference
25     Screen &screen = getScreen(); // get reference
27     amount = promptForDepositAmount(); // get deposit amount from user
29     // check whether user entered a deposit amount or canceled
30     if ( amount != CANCELED )
31     {
32        // request deposit envelope containing specified amount
33        screen.displayMessage(
34           "\nPlease insert a deposit envelope containing " );
35        screen.displayDollarAmount( amount );
36        screen.displayMessageLine( " in the deposit slot." );
38        // receive deposit envelope
39        bool envelopeReceived = depositSlot.isEnvelopeReceived();
41        // check whether deposit envelope was received
42        if ( envelopeReceived )
43        {
44           screen.displayMessageLine( "\nYour envelope has been received."
45              "\nNOTE: The money just will not be available until we"
46              "\nverify the amount of any enclosed cash, and any enclosed "
47              "checks clear." );
49           // credit account to reflect the deposit
50           bankDatabase.credit( getAccountNumber(), amount );
51        } // end if
52        else // deposit envelope not received
53        {
54           screen.displayMessageLine( "\nYou did not insert an "
55              "envelope, so the ATM has canceled your transaction." );
56        } // end else
57     } // end if
58     else // user canceled instead of entering amount
59     {
60        screen.displayMessageLine( "\nCanceling transaction..." );
61     } // end else
62  } // end function execute
64  // prompt user to enter a deposit amount in cents
65  double Deposit::promptForDepositAmount() const
66  {
67     Screen &screen = getScreen(); // get reference to screen
69     // display the prompt and receive input
70     screen.displayMessage( "\nPlease enter a deposit amount in "
71        "CENTS (or 0 to cancel): " );
72     int input = keypad.getInput(); // receive input of deposit amount
74     // check whether the user canceled or entered a valid amount
75     if ( input == CANCELED )
76        return CANCELED;
77     else
78     {
79        return static_cast< double >( input ) / 100; // return dollar amount
80     } // end else
81  } // end function promptForDepositAmount

[Page 1314]

Deposit Class Member-Function Definitions

Figure G.22 presents the implementation file for class Deposit. Line 3 #includes the Deposit class definition, and lines 47 #include the class definitions of the other classes used in Deposit's member functions. Line 9 declares a constant CANCELED that corresponds to the value a user enters to cancel a deposit. We will soon discuss how the class uses this constant.

Like class Withdrawal, class Deposit contains a constructor (lines 1219) that passes three parameters to base class transaction's constructor using a base-class initializer (line 15). The constructor also has parameters atmKeypad and atmDepositSlot, which it assigns to its corresponding data members (line 16).

Member function execute (lines 2262) overrides pure virtual function execute in base class transaction with a concrete implementation that performs the steps required in a deposit transaction. Lines 2425 get references to the database and the screen. Line 27 prompts the user to enter a deposit amount by invoking private utility function promptForDepositAmount (defined in lines 6581) and sets data member amount to the value returned. Member function promptForDepositAmount asks the user to enter a deposit amount as an integer number of cents (because the ATM's keypad does not contain a decimal point; this is consistent with many real ATMs) and returns the double value representing the dollar amount to be deposited.

[Page 1315]

[Page 1316]

Line 67 in member function promptForDepositAmount gets a reference to the ATM's screen. Lines 7071 display a message on the screen asking the user to input a deposit amount as a number of cents or "0" to cancel the transaction. Line 72 receives the user's input from the keypad. The if statement at lines 7580 determines whether the user has entered a real deposit amount or chosen to cancel. If the user chooses to cancel, line 76 returns the constant CANCELED. Otherwise, line 79 returns the deposit amount after converting from the number of cents to a dollar amount by casting input to a double, then dividing by 100. For example, if the user enters 125 as the number of cents, line 79 returns 125.0 divided by 100, or 1.25125 cents is $1.25.

The if statement at lines 3061 in member function execute determines whether the user has chosen to cancel the transaction instead of entering a deposit amount. If the user cancels, line 60 displays an appropriate message, and the member function returns. If the user enters a deposit amount, lines 3336 instruct the user to insert a deposit envelope with the correct amount. Recall that Screen member function displayDollarAmount outputs a double formatted as a dollar amount.

Line 39 sets a local bool variable to the value returned by depositSlot's isEnvelopeReceived member function, indicating whether a deposit envelope has been received. Recall that we coded member function isEnvelopeReceived (lines 710 of Fig. G.10) to always return true, because we are simulating the functionality of the deposit slot and assume that the user always inserts an envelope. However, we code member function execute of class Deposit to test for the possibility that the user does not insert an envelopegood software engineering demands that programs account for all possible return values. Thus, class Deposit is prepared for future versions of isEnvelopeReceived that could return false. Lines 4450 execute if the deposit slot receives an envelope. Lines 4447 display an appropriate message to the user. Line 50 then credits the deposit amount to the user's account in the database. Lines 5455 will execute if the deposit slot does not receive a deposit envelope. In this case, we display a message to the user stating that the ATM has canceled the transaction. The member function then returns without modifying the user's account.

Previous Page
Next Page