In-Class Exercise

Overloading Constructors


This exercise overloads the no-argument constructor and simplifies internal class logic by referring to the current object directly.


Given Information

The following code is a solution to the Handout on Constructors and Destructors.

Client Module

 // Constructors and Destructors
 // h5.cpp

 #include <new>
 #include <iostream>
 using namespace std;
 #include "Transaction.h"

 int main() {
     int n; // user-sprecified number of Transactions
     Transaction* tr;

     cout << "Enter the number of Transactions : ";
     cin  >> n;
     tr = new (nothrow) Transaction[n];
     if (tr == nullptr) {
         cout << "Memory Allocation Error " << endl;
         return 1;
     }

     cout << "Enter " << n << " Transactions" << endl;
     for (int i = 0; i < n; i++)
         tr[i].enter();
     cout << endl;

     cout << "   Account Description             Credit     Debit" << endl; 
     for (int i = 0; i < n; i++) {
         tr[i].display();
         cout << endl;
     }

     delete [] tr;
 }

Transaction Module

Transaction.h

 // Constructor and Destructor
 // Transaction.h

 class Transaction {
     int acct;
     char type;
     char desc[21];
     double amount;
   public:
     Transaction();
     ~Transaction();
     void enter();
     void display() const;
 };

Transaction.cpp

 // Constructors and Destructors
 // Transaction.cpp

 #include <iostream>
 #include <iomanip>
 #include <cstring>
 using namespace std;
 #include "Transaction.h"

 Transaction::Transaction() {
     acct = 0;
     desc[0] = '\0';
     type = 'd';
     amount = 0.0;
 }

 Transaction::~Transaction() { }

 void Transaction::enter() {

     // local variables accept input temporarily
     int      acct_;
     char     type_;
     char desc_[21];
     double amount_;

     // store input from the user in the local variables
     cout << "Enter the account number : ";
     cin  >> acct_;                             ;
     cin.ignore();
     cout << "Enter the desription : ";
     cin.getline(desc_, 21);
     cout << "Enter the account type (d for debit, c for credit) : ";
     cin  >> type_;                             ;
     cout << "Enter the account amount : ";
     cin  >> amount_;

     if (acct_ > 0 && (type_ == 'd' || type_ == 'c') && amount_ > 0.0) { 
         // copy validated input into the instance variables
         acct = acct_;
         type = type_;
         strcpy(desc, desc_);
         amount = amount_;
     }
     else {
         // input was invalid - adopt a safe empty state
         acct = 0;
         type = 'd';
         desc[0] = '\0';
         amount = 0.0;
     }
 }

 void Transaction::display() const {

     if (acct != 0) {
         cout << setw(10) << acct;
         cout << ' ' << setw(20) << left << desc << right;
         cout << setprecision(2) << fixed;
         if (type == 'd')
             cout << setw(20) << amount;
         else
             cout << setw(10) << amount;
     }
     else
         cout << "no data available" << endl;
 }

Your Task

Client Module

The following client program uses your upgraded Transaction module.  The dynamic memory allocation has been removed. 

 // Overloading Constructors
 // h6.cpp

 #include <iostream>
 using namespace std;
 #include "Transaction.h"

 const int N = 3;

 int main() {
     Transaction tr[N];

     cout << "Enter " << n << " Transactions" << endl;
     for (int i = 0; i < N; i++)
         tr[i].enter();
     cout << endl;

     cout << "   Account Description             Credit     Debit" << endl; 
     for (int i = 0; i < N; i++) {
         tr[i].display();
         cout << endl;
     }
 }

Transaction Module

Upgrade the definition of the Transaction class to include a four-argument constructor.  Make sure that your class processes valid as well as invalid input properly.

Transaction.h

Upgrade the header file for your Transaction class:

  1. add the prototype for the four-argument constructor
 // Overloading Constructor
 // Transaction.h

 class Transaction {
     int acct;
     char type;
     char desc[21];
     double amount;
   public:
     Transaction();


     ~Transaction();
     void enter();
     void display() const;
 };

Transaction.cpp

Upgrade the implementation file for your Transaction type:

  1. add the definition for the four-argument constructor
  2. add the logic for validating data to your four-argument constructor
  3. call the four-argument constructor from the enter() function
 // Overloading Constructor
 // Transaction.cpp

 #include <iostream>
 #include <iomanip>
 #include <cstring>
 using namespace std;
 #include "Transaction.h"

 Transaction::Transaction() {
     acct = 0;
     desc[0] = '\0';
     type = 'd';
     amount = 0.0;
 }









 Transaction::~Transaction() { }

 void Transaction::enter() {

     // local variables accept input temporarily
     int      acct_;
     char     type_;
     char desc_[21];
     double amount_;

     // store input from the user in the local variables
     cout << "Enter the account number : ";
     cin  >> acct_;                             ;
     cin.ignore();
     cout << "Enter the desription : ";
     cin.getline(desc_, 21);
     cout << "Enter the account type (d for debit, c for credit) : "; 
     cin  >> type_;                             ;
     cout << "Enter the account amount : ";
     cin  >> amount_;


 }

 void Transaction::display() const {

     if (acct != 0) {
         cout << setw(10) << acct;
         cout << ' ' << setw(20) << left << desc << right;
         cout << setprecision(2) << fixed;
         if (type == 'd')
             cout << setw(20) << amount;
         else
             cout << setw(10) << amount;
     }
     else
         cout << "no data available" << endl;
 }






  Designed by Chris Szalwinski   Copying From This Site   
Logo
Creative Commons License