Previous Section  < Free Open Study >  Next Section

The Trans.hpp File


// Trans. hpp: This header file contains the definition of the 

// classes that make up the Transaction portion of this

// application. The Transaction classes are interesting in that

// they span both sides of the application, i.e., they are used by

// both Bank classes and ATM classes. In fact, the transactions

// used by the Bank classes do not need to look anything like the

// transactions used by the ATM classes. In this implementation, I

// have chosen to make them one in the same. The different public

// interfaces are supported via #ifdef's using ATM_SIDE and

// BANK_SIDE macros to differentiate them.



#ifndef _TRANS_

#define _TRANS_



#include <stdio.h>

#include <iostream.h>

#include <string.h>

#include <math.h>

#include <time.h>



#include ''consts.hpp''



// Forward references

class Account;

class AccountList;

class ATM;



// A TimeStamp object encapsulates the data and time of a

// transaction. Its current implementation is that of a string

// produced via the time and ctime library routines. The reader

// should feel free to come up with something more elaborate.

class TimeStamp{

     char date_time[small_string*2];

public:

     TimeStamp();

     void print(FILE*);

};





// All transactions have a TimeStamp, one account name, its PIN

// number, and an amount. (Note: While Balance transactions do not

// need an amount, they use it to carry back the balance value.)

// Recall that protected accessor methods are perfectly

// appropriate. The packetize method is used to turn the object

// into a string suitable for shipping across the network. It

// requires every transaction (derived classes included) to know

// the format of this string, but the alternative is to have the

// Transaction class grant friendship to the network or at least

// provide a collection of accessor methods. The latter tends to be

// problematic in that all classes gain access to the abstract

// implementation of the Transaction class. This format knowledge

// does not imply that a network needs to ship the format as is. It

// implies only that they must use it to produce the final packets

// they will ship.

class Transaction{

     TimeStamp timeStamp;

     char source_account[small_string];

     char pin[small_string];

     double amount;

protected:

     Transaction(char* account, char* p, double a);

   char* get_source_account();

     double get_amount();

   void set_amount(double new_amount);

public:

  virtual void print(FILE*);

  virtual char* type() = 0;

//Only ATM classes use the preprocess, postprocess, and update

// methods. The Transaction class for the Bank side of the

// application never compiles them into the object code.

   #ifdef ATM_SIDE

   virtual int preprocess(ATM*);

   virtual void postprocess(ATM*);

   virtual void update(char* info, int count);

   virtual void packetize(char* buf);

#endif

// The process and verify_account methods are used only by the

// classes on the Bank's side of the application. The Transaction

// class for the ATM side of the application never compiles them

// into the object code.

#ifdef BANK_SIDE

     virtual int process(AccountList* accounts) = 0;

   int verify_account(Account*);

   virtual void packetize(int status, char* buf);

#endif

};



// The following four classes are the derived classes of the

// abstract Transaction class : Deposit, Withdraw, Balance, and

// Transfer.



class Deposit : public Transaction {

public:

     Deposit(char* account, char* p, double a);

      void print(FILE*);

            char* type();

#ifdef ATM_SIDE

     int preprocess(ATM*);

#endif

#ifdef BANK_SIDE

     int process(AccountList* accounts);

#endif

};





class Withdraw : public Transaction {

public:

     Withdraw(char* account, char* p, double a);

            char* type();

#ifdef ATM_SIDE

     int preprocess(ATM*);

     void postprocess(ATM*);

#endif

#ifdef BANK_SIDE

     int process(AccountList* accounts);

#endif

     void print(FILE*);

};





class Balance : public Transaction {

      double balance;

public:

      Balance(char* account, char* p);

       void print(FILE*);

             char* type();

#ifdef ATM_SIDE

     void update(char* info, int count);

#endif

#ifdef BANK_SIDE

      int process(AccountList* accounts);

#endif

};



// The Transfer class adds the additional data member of

// target_account since the money needs to be transferred

// someplace.

class Transfer : public Transaction {

      char target_account[small_string];

public:

     Transfer(char* s_account, char* p, char* t_account, double

a);

     void print(FILE*);

     char* type();

#ifdef ATM_SIDE

     void packetize(char* buf);

#endif



#ifdef BANK_SIDE

     int process(AccountList* accounts);

#endif

};





class TransactionList{

     Transaction** TransList;

     int transnum;

     unsigned size;

public:

     TransactionList(unsigned sz);

     ~TransactionList();

     int add_trans(Transaction*);

     void print(FILE*);

     void cleanup();

};





#endif

    Previous Section  < Free Open Study >  Next Section