Listing 1: Class declarations for design 1

class
CashBox;
class FrontPanel;
class Mixer;
class Dispenser;

class CoffeeMachine
{
public:
    CoffeeMachine();
    ~CoffeeMachine();
    void insertCoin(int amount);
    void select(int drink);
    void returnCoin();
    enum Ingredient {
        SUGAR, CREAM, WATER, COFFEE, CUP,
        NUM_INGRED};
    enum DispAmount {INIT_AMOUNT = 20};
private:
    CashBox* pCashBox;
    FrontPanel* pFrontPanel;
    Mixer* pMixer;
};

// CashBox class
// Responsibility:
//   Knows amount of money put in.
//   Gives change.
//   Knows price of coffee.
//   Turns FrontPanel on and off.

class CashBox
{
public:
    CashBox(FrontPanel* pFP);
    void insertCoin(int amount);
    void coinReturnPushed();
    void coffeeServed();
    bool makeChange(bool );
    void ejectCoin();
    void ejectAllCoins();
private:
    FrontPanel* pFrontPanel;
};

// class FrontPanel
// Responsibilities:
//   Captures selection.
//   Knows what to mix in each cup.
//   Instructs Mixer what to mix.
class FrontPanel
{
public:
    FrontPanel(Mixer* pM);
    void enable();
    void disable();
    void select(int drinkType);
    void nowOutOf(int ingred);
    enum Drinks {
        BLACK, WHITE, BLACK_SUGAR, WHITE_SUGAR, NUM_CHOICES};
private:
    Mixer* pMixer;
    CashBox* pCashBox;
};

// class Mixer
// Responsibilities:
//   Knows how to talk to dispensers.
//   Mixer owns Dispensers in this design
//     (else it is a useless object)
class Mixer
{
public:
    Mixer();
    ~Mixer();
    void dispense(int ingred);
    void nowOutOf(int ingred);
    void setFrontPanel(FrontPanel* pfp);
    void addDispenser(
        int ingred, int init_amount);
private:
    vector<Dispenser*> dispensers;
    FrontPanel* pFrontPanel;
};

// class Dispenser
// Responsibilities:
//   Knows how to dispense a fixed amount.
//   Knows when it's empty.
class Dispenser
{
public:
    Dispenser(Mixer* pM, int ingred,
        int initAmount);
    void dispense();
private:
    Mixer* pMixer;
};

//End of File