Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Error C2259: 'SavingsAccount' Cannot instantiate abstract clas

$
0
0
Hello Everyone, I've been working on this project for a little bit, but have run into a snag. This is a learning project on Polymorphism using different Banking Account types.

I have 3 issues that I can't seem to resolve as follows:

  • error C2259: 'SavingsAccount' : cannot instantiate abstract class. The error is flagging as my account[0] vector declaration.
    accounts[ 0 ] = new SavingsAccount( 25.0, .03 );
    

  • error C2259: 'SavingsAccount' : cannot instantiate abstract class. The error is flagging as my account[2] vector declaration.
    accounts[ 2 ] = new SavingsAccount( 200.0, .015 );
    

  • error C2059: syntax error : '*'. I am attempting to use a dynamic_cast to downcast my Account pointer 'i' to a SavingsAccount pointer. I'm a little confused as to proper syntax, it is the '*' in '<*savingsAccountPtr>' that is flagging the error. It says it expected a type specifier?
    SavingsAccount *savingsAccountPtr = dynamic_cast<*savingsAccountPtr>(accounts[i]);
    


All of the errors are in my polymorphicBanking.cpp file, but I am providing all the project files below. If anyone can tell me what I am doing wrong and how to resolve my issues, it would be most appreciated! I'm still pretty new at C++ :/


polymorphicBanking.cpp
// Lab 1: polymorphicBanking.cpp
// Processing Accounts polymorphically.
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;

#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() << endl;
	  
      double withdrawalAmount = 0.0;
      cout << "\nEnter an amount to withdraw from Account " << i + 1 
         << ": ";
      cin >> withdrawalAmount;

	  accounts[i]->debit(withdrawalAmount);

      double depositAmount = 0.0;
      cout << "Enter an amount to deposit into Account " << i + 1 
         << ": ";
      cin >> depositAmount;

	  accounts[i]->credit(depositAmount);

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


      // if Account is a SavingsAccount, calculate and add interest
      if ( &savingsAccountPtr != 0 )
      {
         double interestEarned = savingsAccountPtr->calculateInterest();;
         cout << "Adding $" << interestEarned << " interest to Account "
            << i + 1 << " (a SavingsAccount)" << endl;
         /* Use the credit function to credit interestEarned to
		    the SavingsAccount pointed to by savingsAccountPtr*/
		 savingsAccountPtr->credit(interestEarned);
      } // end if
      
      cout << "Updated Account " << i + 1 << " balance: $" 
		 << accounts[i]->getBalance()
		 << "\n\n";
   } // end for
} // end main



Account.h
// Account.h
// Definition of Account class.
#ifndef ACCOUNT_H
#define ACCOUNT_H

class Account
{
public:
   Account( double ); // constructor initializes balance
   virtual void credit(double) = 0;
   virtual bool debit(double) = 0;
   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



Account.cpp
// Account.cpp
// Member-function definitions for class Account.
#include <iostream>
using namespace std;

#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



CheckingAccount.h
// 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 );
   void credit(double);
   bool debit(double);

private:
   double transactionFee; // fee charged per transaction

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

#endif



CheckingAccount.cpp
// CheckingAccount.cpp
// Member-function definitions for class CheckingAccount.
#include <iostream>
using namespace std;

#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



SavingsAccount.h
// 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



SavingsAccount.cpp
// 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


Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>