// meal2.cxx - second attempt at pricing a meal
#include <stream.h>

enum ENTREE {Steak,Fish};
enum DESSERT {Pie,Cake,Jello};
enum APPETIZER {Melon,ShrimpCocktail};

class Dessert   // An abstract class - never instantiated by itself
    {
public:
    virtual double cost() 
        { printf("Dessert error, no cost() provided\n"); return 0;}
    };

class Jello_obj : public Dessert
    {
public:
    double cost() {return .60;}
    };

class Pie_obj : public Dessert
    {
public:
    double cost() {return 1.50;}
    };

class Cake_obj : public Dessert
    {
public:
    };

class Entree
    {
public:
    virtual double cost()
        { printf("Entree error, no cost() provided\n"); return 0;}
    };

class Fish_obj : public Entree
    {
public:
    double cost() {return 4.00;}
    };

class Steak_obj : public Entree
    {
public:
    double cost() {return 7.50;}
    };

class Appetizer
    {
public:
    virtual double cost() 
        { printf("Appetizer error, no cost() provided\n"); return 0;}
    };

class Cocktail_obj : public Appetizer
    {
public:
    double cost() { return 2.00;}
    };

class Melon_obj : public Appetizer
    {
public:
    double cost() { return .85;}
    };

class Meal 
    {
    Appetizer *a;
    Entree *e;
    Dessert *d;
public:
    Meal(APPETIZER=Melon,ENTREE=Fish,DESSERT=Jello);
    ~Meal();
    double cost();
    };

//-------------------------------------------
// class member function definitions

double Meal::cost() {return d->cost() + a->cost() + e->cost(); }

Meal::Meal(APPETIZER aval,ENTREE eval,DESSERT dval)
    {
    if ( dval == Jello ) d = new Jello_obj;
    else if ( dval == Pie ) d = new Pie_obj;
    else d = new Cake_obj;
    if ( eval == Steak ) e = new Steak_obj;
    else e = new Fish_obj;
    if ( aval == Melon ) a = new Melon_obj;
    else a = new Cocktail_obj;
    }
Meal::~Meal() { delete a; delete e; delete d; }
//--------------------------------------------

main()
    {
    Meal m1(Melon,Fish,Jello);
    Meal m2(Melon,Steak,Pie);
    Meal m3(ShrimpCocktail,Steak,Cake);
    printf("Meal1 Price %6.2f, Meal2 price %6.2f, Meal3 price %6.2f\n"
        ,m1.cost(),m2.cost(),m3.cost());
    }
// ---- sample output below -----
Dessert error, no cost() provided
Meal1 Price   5.45, Meal2 price   9.85, Meal3 price   9.50
