1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
#include <iostream>
#include <map>
using namespace std;
class Product
{
// product attributes
unsigned int _number; // this needs to be unique
string _name;
double _price;
// declared but not defined to prevent an uninitialized product
Product();
public:
Product( unsigned int number, string name, double price )
: _number( number ),
_name( name ),
_price( price )
{
}
unsigned int getNumber() const { return _number; }
string getName() const { return _name; }
double getPrice() const { return _price; }
// dumps data for debugging/testing
void dump() const
{
cout << _number << endl << _name << endl << _price << endl;
}
};
class Catalog
{
// maps are associative containers, here it maps a
// unique product number to an actual Product object pointer
typedef unsigned int ProductNumber;
typedef map<ProductNumber, Product *> Products;
Products _products;
Catalog()
{
// read catalog from disk or something here
// to initialize the Product objects
ProductNumber number( 1 );
_products[number] = new Product( number, "XYZ", 1.99 ); ++number;
_products[number] = new Product( number, "ABC", 0.99 ); ++number;
_products[number] = new Product( number, "CAR", 999.99 ); ++number;
}
~Catalog()
{
// destroy the dynamically created Product objects
for( Products::iterator i = _products.begin(); i != _products.end(); ++i )
{
delete (*i).second;
}
}
// this maintains the Catalog singleton
static Catalog & instance()
{
static Catalog catalog;
return catalog;
}
public:
// this method looks up a Product object given the unique number
static Product & getProduct( unsigned int number )
{
return *instance()._products[number];
}
};
class Order
{
typedef unsigned int ProductNumber;
typedef unsigned int Quantity;
typedef map<ProductNumber, Quantity> Products;
unsigned int _number;
string _customer;
Products _products;
Order();
public:
Order( unsigned int number, string customer )
: _number( number ),
_customer( customer )
{
}
void add( const Product & product, unsigned int quantity = 1 )
{
_products[product.getNumber()] = quantity;
}
// compute the total price of the items in the order
double total() const
{
double total( 0 );
for( Products::const_iterator i = _products.begin(); i != _products.end(); ++i )
{
// for each product in the order, total += unit price * quantity
total += Catalog::getProduct( (*i).first ).getPrice() * (*i).second;
}
return total;
}
// dumps data for debugging/testing
void dump() const
{
cout << _number << endl << _customer << endl;
for( Products::const_iterator i = _products.begin(); i != _products.end(); ++i )
{
cout << endl;
Catalog::getProduct( (*i).first ).dump();
}
}
};
int main( int argc, char * argv[] )
{
// consider creating a Store class or something to manage creating sales
// create a sale
Order sale( 1, "Customer" );
sale.add( Catalog::getProduct( 1 ) );
sale.add( Catalog::getProduct( 2 ), 2 );
sale.dump();
cout << endl << "TOTAL: " << sale.total() << endl;
return 0;
}
|