Notes From Special Session, 11/5/96

The code below for solving the payroll problem was developed on-the-fly during the special session. This code should not be construed to be the best OOP implementation although it is a reasonable one. Later, I will put up a better solution.
#include < fstream.h >
#include < iostream.h >
#include < stdlib.h >
#include < stdio.h >
#include < string.h >

class Employee
{
public:
   Employee(void *e, char *nm, Employee *n, float (* p)(int, void *), void (* d)(void *))
   {
      employee = e;
      next = n;
      getPay = p;
      dispfn = d;
      strncpy(name, nm, 28);
   }
   float pay (int m) {  return (getPay)(m, employee);  }
   Employee *getNext() { return next; }
   char *getName() { return name; }
   void display()
   {
      cout << "  Employee: " << name << " ";
      (dispfn)(employee);
   }
private:
   char name[30];
   void *employee;
   Employee *next;
   float (* getPay)(int, void *);
   void (* dispfn)(void *);
};

class Manager
{
public:
   Manager (float s) {  monthly_salary = s;  }
   float getPay (int m) { return monthly_salary; }
   void  display()
   {
      cout << "\tManager,\tMonthly Salary: " << monthly_salary << "\n";
   }
private:
   float monthly_salary;
};

class Programmer
{
public:
   Programmer (float r)
   {
      rate = r;
      for (int i=0 ; i < 12 ; i++) hours[i] = 0;
   }
   void  setHours (int m, int h) { hours[m] = h; }
   float getPay(int m) { return hours[m]*rate; }
   void  display()
   {
      cout << "\tProgrammer,\tRate: " << rate << "\n";
   }
private:
   int hours[12];
   float rate;
};

class Agent
{
public:
   Agent (float c, float b)
   {
      commission = c;
      base_pay = b;
      for (int i=0 ; i < 12 ; i++) sales[i] = 0;
   }
   void  setSales (int m, float s) { sales[m] = s; }
   float getPay(int m) { return commission*sales[m] + base_pay; }
   void  display()
   {
      cout << "\tIns. Agent,\tBase pay: " << base_pay
           << "\tCommission: " << commission << "\n";
   }
private:
   float commission;
   float base_pay;
   float sales[12];
};

float man(int m, void *o)   {  return ((Manager *)(o))->getPay(m);  }
float prog(int m, void *o)  {  return ((Programmer *)(o))->getPay(m);  }
float agent(int m, void *o) {  return ((Agent *)(o))->getPay(m);  }

void manDisplay(void *o)   { ((Manager *)(o))->display();  }
void progDisplay(void *o)  { ((Programmer *)(o))->display();  }
void agentDisplay(void *o) { ((Agent *)(o))->display();  }

void setHours(Employee *e, char *name, int mn, int hrs)
{
   for (Employee *f = e ; f != NULL ; f = f->getNext())
   {
      if (!strcmp(f->getName(), name))
      {
         ((Programmer *)(f))->setHours(mn, hrs);
         break;
      }
   }
}

void setSales(Employee *e, char *name, int mn, float sales)
{
   for (Employee *f = e ; f != NULL ; f = f->getNext())
   {
      if (!strcmp(f->getName(), name))
      {
         ((Agent *)(f))->setSales(mn, sales);
         break;
      }
   }
}

float payroll(Employee *e, int mn)
{
   float total=0;

   for (Employee *f = e ; f != NULL ; f = f->getNext()) total += f->pay(mn);
   return total;
}

void display(Employee *e)
{
   for (Employee *f=e ; f != NULL ; f = f->getNext()) f->display();
}

void main()
{
   char *month[] = { "January", "February", "March", "April", "May", "June",
                     "July", "August", "September", "October", "November",
                     "December" };
   Employee *e;
   e = new Employee(new Manager(10000), "John", NULL, man, manDisplay);
   e = new Employee(new Manager(5000), "Jim", e, man, manDisplay);
   e = new Employee(new Manager(4000), "Joan", e, man, manDisplay);
   e = new Employee(new Programmer(7), "Jill", e, prog, progDisplay);
   e = new Employee(new Programmer(5), "Jack", e, prog, progDisplay);
   e = new Employee(new Programmer(4), "Judy", e, prog, progDisplay);
   e = new Employee(new Agent(0.06, 500), "Jerry", e, agent, agentDisplay);
   e = new Employee(new Agent(0.04, 600), "Jory", e, agent, agentDisplay);
   e = new Employee(new Agent(0.03, 700), "Suzanne", e, agent, agentDisplay);
   display(e);
   setHours(e, "Jill", 0, 82);
   setHours(e, "Jack", 0, 64);
   setHours(e, "Judy", 0, 72);
   setSales(e, "Jerry", 0, 3000);
   setSales(e, "Jory", 0, 4000);
   setSales(e, "Suzanne", 0, 4500);
   cout << "\nPayroll for " << month[0] << " is " << payroll(e, 0) << "\n";
}