    001: #include <iostream>
    002: #include <string>
    003: #include <vector>
    004:
    005: using namespace std;
    006:
    007: /**
    008:    Describes a product with a description and a price.
    009: */
    010: class Product
    011: {
    012: public:
    013:    Product();
    014:    Product(string d, double p);
    015:    /**
    016:       Gets the product description.
    017:       @return the description
    018:    */
    019:    string get_description() const;
    020:
    021:    /**
    022:       Gets the product price.
    023:       @return the unit price
    024:    */
    025:    double get_price() const;
    026:
    027: private:
    028:    string description;
    029:    double price;
    030: };
    031:
    032: Product::Product()
    033: {
    034:    price = 0;
    035: }
    036:
    037: Product::Product(string d, double p)
    038: {
    039:    description = d;
    040:    price = p;
    041: }
    042:
    043: string Product::get_description() const
    044: {
    045:    return description;
    046: }
    047:
    048: double Product::get_price() const
    049: {
    050:    return price;
    051: }
    052:
    053: /**
    054:    Describes a quantity of an article to purchase and its price.
    055: */
    056: class Item
    057: {
    058: public:
    059:    Item();
    060:    Item(Product p, int q);
    061:    /**
    062:       Computes the total cost of this item.
    063:       @return the total price
    064:    */
    065:    double get_total_price() const;
    066:
    067:    /**
    068:       Prints this item.
    069:    */
    070:    void print() const;
    071: private:
    072:    Product prod;
    073:    int quantity;
    074: };
    075:
    076:
    077: Item::Item()
    078: {
    079:    quantity = 0;
    080: }
    081:
    082: Item::Item(Product p, int q)
    083: {
    084:    prod = p;
    085:    quantity = q;
    086: }
    087:
    088: double Item::get_total_price() const
    089: {
    090:    return prod.get_price() * quantity;
    091: }
    092:
    093: void Item::print() const
    094: {
    095:    const int COLUMN_WIDTH = 30;
    096:    string description = prod.get_description();
    097:
    098:    cout << description;
    099:
    100:    // pad with spaces to fill column
    101:
    102:    int pad = COLUMN_WIDTH - description.length();
    103:    for (int i = 1; i <= pad; i++)
    104:       cout << " ";
    105:
    106:    cout << prod.get_price()
    107:       << "   " << quantity
    108:       << "   " << get_total_price() << "\n";
    109: }
    110:
    111: /**
    112:    Describes a mailing address.
    113: */
    114: class Address
    115: {
    116: public:
    117:    Address();
    118:    Address(string n, string s,
    119:       string c, string st, string z);
    120:    /**
    121:       Prints the address.
    122:    */
    123:    void print() const;
    124: private:
    125:    string name;
    126:    string street;
    127:    string city;
    128:    string state;
    129:    string zip;
    130: };
    131:
    132: Address::Address() {}
    133:
    134: Address::Address(string n, string s,
    135:    string c, string st, string z)
    136: {
    137:    name = n;
    138:    street = s;
    139:    city = c;
    140:    state = st;
    141:    zip = z;
    142: }
    143:
    144: void Address::print() const
    145: {
    146:    cout << name << "\n" << street << "\n"
    147:       << city << ", " << state << " " << zip << "\n";
    148: }
    149:
    150: /**
    151:    Describes an invoice for a set of purchased products.
    152: */
    153: class Invoice
    154: {
    155: public:
    156:    Invoice(Address a);
    157:    /**
    158:       Adds a charge for a product to this invoice.
    159:       @param aProduct the product that the customer ordered
    160:       @param quantity the quantity of the product
    161:    */
    162:    void add(Product p, int quantity);
    163:    /**
    164:       Prints the invoice.
    165:    */
    166:    void print() const;
    167: private:
    168:    Address billing_address;
    169:    vector<Item> items;
    170: };
    171:
    172: Invoice::Invoice(Address a)
    173: {
    174:    billing_address = a;
    175: }
    176:
    177: void Invoice::add(Product p, int q)
    178: {
    179:    Item it(p, q);
    180:    items.push_back(it);
    181: }
    182:
    183: void Invoice::print() const
    184: {
    185:    cout << "                     I N V O I C E\n\n";
    186:    billing_address.print();
    187:    cout <<
    188:       "\n\nDescription                   Price  Qty  Total\n";
    189:    for (int i = 0; i < items.size(); i++)
    190:       items[i].print();
    191:
    192:    double amount_due = 0;
    193:    for (int i = 0; i < items.size(); i++)
    194:       amount_due = amount_due + items[i].get_total_price();
    195:
    196:    cout << "\nAMOUNT DUE: $" << amount_due;
    197: }
    198:
    199: int main()
    200: {
    201:    Address sams_address("Sam's Small Appliances",
    202:          "100 Main Street", "Anytown", "CA", "98765");
    203:
    204:    Invoice sams_invoice(sams_address);
    205:    sams_invoice.add(Product("Toaster", 29.95), 3);
    206:    sams_invoice.add(Product("Hair dryer", 24.95), 1);
    207:    sams_invoice.add(Product("Car vacuum", 19.99), 2);
    208:
    209:    sams_invoice.print();
    210:    return 0;
    211: }