//
//  NAME
//    person.h
//
//  DESCRIPTION
//    This file contains the type definitions and function prototypes
//    exported by the Person module.
//

#ifndef _person_h_
#define _person_h_

//
//  Include files.
//

#include <string.h>
#include <iostream.h>


//
//  NAME
//    person
//
//  DESCRIPTION
//    This abstract class models a person.
//
//  DATA MEMBERS
//    name  (protected) - person's name.
//
//  FUNCTION MEMBERS
//
//    person()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    person(const person& p)
//        Copy constructor.
//        Parameters:  p  (in) - source person.
//        Returns:     (none)
//
//    clone()
//        This pure virtual function clones the person.
//        Parameters:  (none)
//        Returns:     pointer to a copy of the person.
//
//    read()
//        This pure virtual function reads the information about
//        the person.
//        Parameters:  (none)
//        Returns:     (none)
//
//    display()
//        This pure virtual function displays the information about
//        the person.
//        Parameters:  (none)
//        Returns:     (none)
//
//    readName()
//        This function reads the person's name.
//        Parameters:  (none)
//        Returns:     (none)
//
//    displayName()
//        This function displays the person's name.
//        Parameters:  (none)
//        Returns:     (none)
//
//  MEMBER CONSTANTS
//    nameLen  - maximum length of the person's name.
//

class person {
   public:
      person() { strcpy(name, ""); }
      person(const person& p) { strcpy(name, p.name); }
      virtual person * clone() const = 0;
      virtual void read() = 0;
      virtual void display() const = 0;
      void readName();
      void displayName() const;
      enum { nameLen = 20 };
   protected:
      char name[nameLen+1];
};


//
//  NAME
//    academic
//
//  DESCRIPTION
//    This class models an academic object.
//
//  DATA MEMBERS
//    department  (protected) - acedemic's object.
//
//  FUNCTION MEMBERS
//
//    academic()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    academic(const academic& p)
//        Copy constructor.
//        Parameters:  a  (in) - source academic.
//        Returns:     (none)
//
//    readDept()
//        This function reads the academic's department.
//        Parameters:  (none)
//        Returns:     (none)
//
//    displayDept()
//        This function displays the academic's department.
//        Parameters:  (none)
//        Returns:     (none)
//
//  MEMBER CONSTANTS
//    deptLen  - maximum length of the academic's department.
//

class academic {
   public:
      academic() { strcpy(dept, ""); }
      academic(const academic& a) { strcpy(dept, a.dept); }
      void readDept();
      void displayDept() const;
      enum { deptLen = 4 };
   protected:
      char dept[deptLen+1];
};


//
//  NAME
//    industry
//
//  DESCRIPTION
//    This class models an industry object.
//
//  DATA MEMBERS
//    company  (protected) - industry's company name.
//
//  FUNCTION MEMBERS
//
//    industry()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    industry(const industry& i)
//        Copy constructor.
//        Parameters:  i  (in) - source industry.
//        Returns:     (none)
//
//    readCompany()
//        This function reads the industry's company name.
//        Parameters:  (none)
//        Returns:     (none)
//
//    displayCompany()
//        This function displays the industry's company name.
//        Parameters:  (none)
//        Returns:     (none)
//
//  MEMBER CONSTANTS
//    companyLen  - maximum length of the industry's company name.
//

class industry {
   public:
      industry() { strcpy(company, ""); }
      industry(const industry& i) { strcpy(company, i.company); }
      void readCompany();
      void displayCompany() const;
      enum { companyLen = 15 };
   protected:
      char company[companyLen+1];
};


//
//  NAME
//    employee
//
//  DESCRIPTION
//    This class models a employee.  It is derived from person.
//
//  DATA MEMBERS
//    salary  (protected) - employee's salary.
//
//  FUNCTION MEMBERS
//
//    employee()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    employee(const employee& e)
//        Copy constructor.
//        Parameters:  e  (in) - source employee.
//        Returns:     (none)
//
//    readSalary()
//        This function reads the employee's salary.
//        Parameters:  (none)
//        Returns:     (none)
//
//    displaySalary()
//        This function displays the employee's salary.
//        Parameters:  (none)
//        Returns:     (none)
//

class employee : public person {
   public:
      employee() { salary = 0; }
      employee(const employee& e) { salary = e.salary; }
      void readSalary();
      void displaySalary() const;
   protected:
      int salary;
};


//
//  NAME
//    student
//
//  DESCRIPTION
//    This class models a student.  It is derived from person
//    and academic.
//
//  FUNCTION MEMBERS
//
//    student()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    student(const student& s)
//        Copy constructor.
//        Parameters:  s  (in) - source student.
//        Returns:     (none)
//
//    clone()
//        This virtual function clones the student.
//        Parameters:  (none)
//        Returns:     pointer to a copy of the student.
//
//    read()
//        This virtual function reads the information about
//        the student.
//        Parameters:  (none)
//        Returns:     (none)
//
//    display()
//        This virtual function displays the information about
//        the student.
//        Parameters:  (none)
//        Returns:     (none)
//

class student : public person, public academic {
   public:
      student() { ; }
      student(const student& s);
      person * clone() const;
      void read();
      void display() const;
};


//
//  NAME
//    instructor
//
//  DESCRIPTION
//    This class models a student.  It is derived from employee
//    and academic.
//
//  FUNCTION MEMBERS
//
//    instructor()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    instructor(const instructor& i)
//        Copy constructor.
//        Parameters:  i  (in) - source instructor.
//        Returns:     (none)
//
//    clone()
//        This virtual function clones the instructor.
//        Parameters:  (none)
//        Returns:     pointer to a copy of the instructor.
//
//    read()
//        This virtual function reads the information about
//        the instructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    display()
//        This virtual function displays the information about
//        the instructor.
//        Parameters:  (none)
//        Returns:     (none)
//

class instructor : public employee, public academic {
   public:
      instructor() { ; }
      instructor(const instructor& i);
      person * clone() const;
      void read();
      void display() const;
};


//
//  NAME
//    programmer
//
//  DESCRIPTION
//    This class models a programmer.  It is derived from employee
//    and industry.
//
//  FUNCTION MEMBERS
//
//    programmer()
//        Default constructor.
//        Parameters:  (none)
//        Returns:     (none)
//
//    programmer(const programmer& p)
//        Copy constructor.
//        Parameters:  p  (in) - source programmer.
//        Returns:     (none)
//
//    clone()
//        This virtual function clones the programmer.
//        Parameters:  (none)
//        Returns:     pointer to a copy of the programmer.
//
//    read()
//        This virtual function reads the information about
//        the programmer.
//        Parameters:  (none)
//        Returns:     (none)
//
//    display()
//        This virtual function displays the information about
//        the programmer.
//        Parameters:  (none)
//        Returns:     (none)
//

class programmer : public employee, public industry {
   public:
      programmer() { ; }
      programmer(const programmer& p);
      person * clone() const;
      void read();
      void display() const;
};


#endif