    001: #include <string>
    002: #include <iostream>
    003:
    004: using namespace std;
    005:
    006: #include "ccc_empl.h"
    007:
    008: /**
    009:    A department in an organization.
    010: */
    011: class Department
    012: {
    013: public:
    014:    Department(string n);
    015:    Department(string n, Employee e);
    016:    ~Department();
    017:    Department& operator=(const Department& b);
    018:    Department(const Department& b);
    019:    void print() const;
    020: private:
    021:    string name;
    022:    Employee* receptionist;
    023: };
    024:
    025: /**
    026:    Constructs a department with a given name and no receptionist.
    027:    @param n the department name
    028: */
    029: Department::Department(string n)
    030: {
    031:    name = n;
    032:    receptionist = NULL;
    033:
    034:    cout << "Constructor: ";
    035:    print();
    036: }
    037:
    038: /**
    039:    Constructs a department with a given name and receptionist.
    040:    @param n the department name
    041:    @param e the receptionist
    042: */
    043: Department::Department(string n, Employee e)
    044: {
    045:    name = n;
    046:    receptionist = new Employee(e.get_name(), e.get_salary());
    047:
    048:    cout << "Constructor: ";
    049:    print();
    050: }
    051:
    052: /**
    053:    Deletes the Employee object that this Department
    054:    object manages.
    055: */
    056: Department::~Department()
    057: {
    058:    cout << "Destructor: ";
    059:    print();
    060:
    061:    delete receptionist;
    062: }
    063:
    064: /**
    065:    Constructs a Department object as a copy of another
    066:    Department object.
    067:    @param b the object to copy
    068: */
    069: Department::Department(const Department& b)
    070: {
    071:    cout << "Copy constructor: ";
    072:    b.print();
    073:
    074:    name = b.name;
    075:    if (b.receptionist == NULL)
    076:       receptionist = NULL;
    077:    else
    078:       receptionist = new Employee(b.receptionist->get_name(),
    079:          b.receptionist->get_salary());
    080: }
    081:
    082: /**
    083:    Sets this Department object to a copy of another
    084:    Department object.
    085:    @param b the object to copy
    086: */
    087: Department& Department::operator=(const Department& b)
    088: {
    089:    cout << "Assignment: ";
    090:    print();
    091:    cout << "= ";
    092:    b.print();
    093:
    094:    if (this != & b)
    095:    {
    096:       name = b.name;
    097:       delete receptionist;
    098:       if (b.receptionist == NULL)
    099:          receptionist = NULL;
    100:       else
    101:          receptionist = new Employee(b.receptionist->get_name(),
    102:             b.receptionist->get_salary());
    103:    }
    104:    return *this;
    105: }
    106:
    107: /**
    108:    Prints a description of this department.
    109: */
    110: void Department::print() const
    111: {
    112:    cout << "[name=" << name << ",receptionist=";
    113:    if (receptionist == NULL)
    114:       cout << "NULL";
    115:    else
    116:       cout << receptionist->get_name();
    117:    cout << "]\n";
    118: }
    119:
    120: int main()
    121: {
    122:    Department shipping("Shipping");
    123:    Department qc("Quality Control",
    124:       Employee("Tester, Tina", 50000));
    125:    Department dept(qc);
    126:    dept = shipping;
    127:    return 0;
    128: }
    129:
    130:
    131: