// Ray Torres
// Project
//
// main.cpp
#include
"Customer.h"
#include
"Bicycle.h"
#include
"Rental.h"
#include <iostream>
using
namespace std;
int
main() {
Customer ray("Ray Torres");
try {
Bicycle daughterBike("F Child
Bicycle 1", CHILD);
Bicycle grandpaBike("M Adult
Bicycle 1", SENIOR);
Bicycle dadBike("M Adult
Bicycle 2", ADULT);
Rental weekend( grandpaBike, 2);
Rental week( daughterBike, 5);
Rental day( dadBike, 1);
ray.addRental( weekend );
ray.addRental( week );
ray.addRental( day );
cout << ray.statement()
<< endl;
}
catch (
InvalidPriceCodeException ex ) { // exception
handler
cout << "Exception
occurred: " << ex.what() << '\n';
}
return 0;
}
// Bicycle.h
#ifndef
BICYCLE_H
#define
BICYCLE_H
#include
<string>
#include
"Price.h"
using
namespace std;
enum
{
ADULT = 0,
CHILD,
SENIOR
};
class
Bicycle {
public:
Bicycle( const
string& bikeId, int priceCode = ADULT );
Bicycle( const
Bicycle& );
~Bicycle() {
delete
price;
}
Bicycle& operator=(
const Bicycle& bike );
int
getPriceCode() const;
void
setPriceCode( int priceCode );
double
getCharge( int daysRented ) const;
string getId() const
{
return
id;
}
private:
string id;
Price* price;
};
class
InvalidPriceCodeException {
public:
InvalidPriceCodeException()
: message( "Invalid Price Code
Used" ) { }
const char *what() const { return message; }
private:
const char *message;
};
#endif
// BICYCLE_H
// Customer.h
#ifndef
CUSTOMER_H
#define
CUSTOMER_H
#include
<vector>
#include
<string>
#include
"Rental.h"
using
namespace std;
class
Customer {
public:
Customer() {}
explicit
Customer( const string& name ) : custName(
name ) {}
void
addRental( const Rental& arg ) {
rentals.push_back( arg );
}
string getName() const
{
return
custName;
}
string statement();
private:
string custName;
vector< Rental > rentals;
double
getTotalCharge();
};
#endif
// CUSTOMER_H
// Rental.h
#ifndef
RENTAL_H
#define
RENTAL_H
#include
"Bicycle.h"
class
Rental {
public:
Rental( const
Bicycle& bicycle, int daysRented ) :
bicycle( bicycle ), numOfDaysRented( daysRented ) {}
int
getDaysRented() const {
return
numOfDaysRented;
}
const
Bicycle & getBicycle() const {
return
bicycle;
}
double
getCharge() const;
private:
Bicycle bicycle;
int
numOfDaysRented;
};
#endif
// RENTAL_H
// Price.h
#ifndef
PRICE_H
#define
PRICE_H
class
Price {
public:
virtual
~Price() {}
virtual int getPriceCode() const
= 0;
virtual double getCharge( int
daysRented ) const = 0;
};
#endif
// PRICE_H
// AdultPrice.h
#ifndef
ADULTPRICE_H
#define
ADULTPRICE_H
#include
"Price.h"
class
AdultPrice : public Price {
public:
virtual int getPriceCode() const;
virtual double getCharge( int
daysRented ) const;
};
#endif
// ADULTPRICE_H
// ChildPrice.h
#ifndef
CHILDPRICE_H
#define
CHILDPRICE_H
#include
"Price.h"
class
ChildPrice : public Price {
public:
virtual int getPriceCode() const;
virtual double getCharge( int
daysRented ) const;
};
#endif
// CHILDPRICE_H
// SeniorPrice.h
#ifndef
SENIORPRICE_H
#define
SENIORPRICE_H
#include
"Price.h"
class
SeniorPrice : public Price {
public:
virtual int getPriceCode() const;
virtual double getCharge( int
daysRented ) const;
};
#endif
// SENIORPRICE_H
// Bicycle.cpp
#include
"Bicycle.h"
#include
"AdultPrice.h"
#include
"ChildPrice.h"
#include
"SeniorPrice.h"
Bicycle::Bicycle(
const string& bikeId, int priceCode ) : id( bikeId ), price( 0 ) {
setPriceCode( priceCode );
}
Bicycle::Bicycle(
const Bicycle& bicycle ) : id( bicycle.id
), price( 0 ) {
setPriceCode( bicycle.getPriceCode() );
}
Bicycle&
Bicycle::operator=( const
Bicycle& bike ) {
if ( this == &bike )
return
*this;
id = bike.id;
setPriceCode( bike.getPriceCode() );
return *this;
}
int
Bicycle::getPriceCode() const {
return
price->getPriceCode();
}
void
Bicycle::setPriceCode( int priceCode ) {
delete
price;
switch (
priceCode ) {
case
ADULT:
price = new AdultPrice;
break;
case
CHILD:
price = new ChildPrice;
break;
case
SENIOR:
price = new SeniorPrice;
break;
default:
throw
InvalidPriceCodeException();
}
}
double
Bicycle::getCharge( int daysRented ) const {
return
price->getCharge( daysRented );
}
// Customer.cpp
#include
<vector>
#include
<sstream>
#include
"Customer.h"
string
Customer::statement() {
vector< Rental >::iterator iter =
rentals.begin();
vector< Rental >::iterator iter_end
= rentals.end();
ostringstream result;
result << "Rental Bike Record
for " << getName() << "\n";
for ( ;
iter != iter_end; ++iter ) {
Rental each = *iter;
// show
figures for this rental
result << "\t"
<< each.getBicycle().getId() << "\t$"
<< each.getCharge()
<< "\n";
}
// add footer
lines
result << "Total charge is
$" << getTotalCharge() << "\n";
return
result.str();
}
double
Customer::getTotalCharge() {
double
result = 0;
vector< Rental >::iterator iter =
rentals.begin();
vector< Rental >::iterator iter_end
= rentals.end();
for ( ;
iter != iter_end; ++iter ) {
Rental each = *iter;
result += each.getCharge();
}
return
result;
}
// Rental.cpp
#include
"Rental.h"
double
Rental::getCharge() const {
return
bicycle.getCharge( numOfDaysRented );
}
// AdultPrice.cpp
#include
"AdultPrice.h"
#include
"Bicycle.h"
int
AdultPrice::getPriceCode() const {
return
ADULT;
}
double
AdultPrice::getCharge( int daysRented ) const {
return
daysRented * 10;
}
// ChildPrice.cpp
#include
"ChildPrice.h"
#include
"Bicycle.h"
int
ChildPrice::getPriceCode() const {
return
CHILD;
}
double
ChildPrice::getCharge( int daysRented ) const {
double
result = 7;
if (
daysRented > 4 )
result += ( daysRented - 4 ) * 5 ;
return
result;
}
// SeniorPrice.cpp
#include
"SeniorPrice.h"
#include
"Bicycle.h"
int
SeniorPrice::getPriceCode() const {
return
SENIOR;
}
double
SeniorPrice::getCharge( int daysRented ) const {
double
result = 8;
if (
daysRented > 1 )
result += ( daysRented - 1 ) * 6 ;
return
result;
}
C:\Documents and Settings\ratorres\My Documents\C++ IV\project\Debug>project
Rental Bike Record for Ray Torres
M Adult Bicycle 1 $14
F Child Bicycle 1 $12
M Adult Bicycle 2 $10
Total charge is $36