Задание: для класса "Служащий" переопределить операции сравнения, реализовав сравнение по окладу, отделу, должности и стажу работы в организации.
Диаграмма классов:
Описание:
Класс employee расширен и включает: поля - объекты классов position и division и методы работы с ними; перегруженные операции сравнения согласно заданию.
Исходный код:
Employee.h
#pragma once
#include "Human.h"
class division
{
int grade_;
char* name_;
public:
division();
~division();
void set_divisionG (int & grade);
void set_divisionN (char* name);
int get_grade() const;
char* get_name() const;
};
class position
{
int grade_;
char* name_;
public:
position();
~position();
void set_positionG (int & grade);
void set_positionN (char* name);
int get_grade() const;
char* get_name() const;
};
class employee:
public Human
{
friend ostream &operator<<(ostream & os, const employee &entry);
friend istream &operator>>(istream & os, employee &entry);
private:
char* company_;
int employment_duration, payment_;
position position_;
division division_;
public:
employee();
employee (char* company, int duration, char* Name, char* Sur, bool M_W, int division_grade, int position_grade, int payment);
employee (const employee & entry);
void set_company (char* Name);
char* get_company() const;
~employee();
void set_duration (int & prolong);
int get_duration() const;
int get_payment() const;
employee & operator=(const employee & st);
void set_divisionG(int & grade);
void set_divisionN(char* name);
void set_positionG(int & grade);
void set_positionN(char* name);
char* get_position() const;
char* get_division() const;
bool operator== (const employee & st) const;
bool operator> (const employee & st) const;
bool operator< (const employee & st) const;
bool operator!= (const employee & st) const;
};
Employee.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "employee.h"
using namespace std;
position::position()
{
name_=(char*) calloc(1, sizeof(char*));
};
position::~position()
{
free(name_);
};
void position::set_positionN(char* name)
{
if (name=="Boss") grade_=4;
else if (name=="Main_Ingineer") grade_=3;
else if (name=="Ingineer") grade_=2;
else grade_=1;
name_=(char*) realloc (name_, (1+strlen(name))*sizeof(char*));
strcpy(name_, name);
};
void position::set_positionG(int & grade)
{
grade_=grade;
switch(grade_)
{
case 1: name_=(char*) realloc (name_, (1+strlen("Worker"))*sizeof(char*));
strcpy(name_, "Worker");
break;
case 2: name_=(char*) realloc (name_, (1+strlen("Ingineer"))*sizeof(char*));
strcpy(name_, "Ingineer");
break;
case 3: name_=(char*) realloc (name_, (1+strlen("Main_Ingineer"))*sizeof(char*));
strcpy(name_, "Main_Ingineer");
break;
case 4: name_=(char*) realloc (name_, (1+strlen("Boss"))*sizeof(char*));
strcpy(name_, "Boss");
break;
}
};
int position::get_grade() const
{
return grade_;
};
char* position::get_name() const
{
return name_;
};
division::division()
{
name_=(char*) calloc(1, sizeof(char*));
};
division::~division()
{
free(name_);
};
void division::set_divisionN(char* name)
{
if (name=="Bosses") grade_=4;
else if (name=="Main_Technicians") grade_=3;
else if (name=="Technicians") grade_=2;
else grade_=1;
name_=(char*) realloc (name_, (1+strlen(name))*sizeof(char*));
strcpy(name_, name);
};
void division::set_divisionG(int & grade)
{
grade_=grade;
switch(grade)
{
case 1: name_=(char*) realloc (name_, (1+strlen("Workers"))*sizeof(char*));
strcpy(name_, "Workers");
break;
case 2: name_=(char*) realloc (name_, (1+strlen("Technicians"))*sizeof(char*));
strcpy(name_, "Technicians");
break;
case 3: name_=(char*) realloc (name_, (1+strlen("Main_Technicians"))*sizeof(char*));
strcpy(name_, "Main_Technicians");
break;
case 4: name_=(char*) realloc (name_, (1+strlen("Bosses"))*sizeof(char*));
strcpy(name_, "Bosses");
break;
}
};
int division::get_grade() const
{
return grade_;
};
char* division::get_name() const
{
return name_;
};
employee::employee()
:Human()
{
company_=(char*) calloc(1, sizeof(char*));
};
employee::employee (char* company, int duration, char* Name, char* Sur, bool M_W, int division_grade, int position_grade, int payment)
: Human (Name, Sur, M_W)
{
employment_duration=duration;
company_=(char*) calloc (1+strlen(company), sizeof(char*));
strcpy(company_, company);
payment_=payment;
division_.set_divisionG(division_grade);
position_.set_positionG(position_grade);
};
employee::employee (const employee & entry)
{
employment_duration=entry.employment_duration;
company_=(char*) realloc (company_, (1+strlen(entry.company_))*sizeof(char*));
strcpy(company_, entry.company_);
set_name(entry.get_name());
set_surname(entry.get_surname());
set_genderB(entry.get_gender());
int a=entry.division_.get_grade();
division_.set_divisionG(a);
a=entry.position_.get_grade();
position_.set_positionG(a);
};
void employee::set_company (char* Name)
{
company_=(char*) realloc (company_, (1+strlen(Name))*sizeof(char*));
strcpy(company_, Name);
};
char* employee::get_company() const
{
return company_;
};
employee::~employee()
{
free(company_);
del_name();
};
void employee::set_duration (int & prolong)
{
employment_duration=prolong;
};
int employee::get_duration() const
{
return employment_duration;
};
ostream &operator<<(ostream & os, const employee &entry)
{
os<<"Name: "<<entry.get_name()<<" "<<entry.get_surname()<<endl;
return os;
};
istream &operator>>(istream & os, employee &entry)
{
char A,B;
os>>A>>B>>entry.company_;
entry.set_name(&A);
entry.set_surname(&B);
return os;
};
employee & employee::operator=(const employee & st)
{
if (this==&st)
return *this;
company_=(char*) realloc (company_, (1+strlen(st.get_company()))*sizeof(char*));
strcpy(company_, st.get_company());
employment_duration=st.get_duration();
set_name(st.get_name());
set_surname(st.get_surname());
set_genderB(st.get_gender());
int a=st.division_.get_grade();
division_.set_divisionG(a);
a=st.position_.get_grade();
position_.set_positionG(a);
return *this;
};
char* employee::get_division() const
{
return division_.get_name();
};
char* employee::get_position() const
{
return position_.get_name();
};
int employee::get_payment() const
{
return payment_;
};
bool employee::operator== (const employee & st) const
{
if (st.get_payment()==payment_) return true;
else return false;
};
bool employee::operator> (const employee & st) const
{
if(division_.get_grade()>st.division_.get_grade()) return true;
else return false;
};
bool employee::operator< (const employee & st) const
{
if(position_.get_grade()>st.position_.get_grade()) return true;
else return false;
};
bool employee::operator!= (const employee & st) const
{
if(get_duration()!=st.get_duration()) return true;
else return false;
};
Пример программы с использованием созданных классов:
#include "employee.h"
int main()
{
employee man("Music_Factory", 4, "Biggie", "Jefferson", true, 3, 3, 200);
employee man_0("Pixels", 3, "Sam", "Adams", true, 4, 4, 500);
if(man_0>man) cout<<man_0;
system("PAUSE");
return 0;
}
Вывод: изучены на практике принципы создания операторов/операций, специфичных для объектов одного класса.