Modificação do sistema de folha de pagamento.
Modifique o sistema de folha pagamento das figuras 21.13
a 21.23 com o objetivo de incluir o dado-membro private
dataNascimento na classe Funcionario. Use a
classe Date das figuras 19.9 e 19.10 para representar
a data de nascimento de um funcionário. Suponha que a
folha de pagamento seja processada uma vez por mês.
Crie um vector de referências a Funcionario para
armazenar os diversos objetos de funcionário. Em um
loop, calcule a folha de pagamento de cada Funcionario
(polimorficamente), e adicione um bônus de R$
100,00 ao valor da folha de pagamento se o mês atual for
o do aniversário do Funcionario.
Passo 1
Introdução
Para criar uma folha de pagamento para cada funcionário que faz aniversário no mês atual, teremos que atualizar a definição da classe base Employee, bem como adicionar a propriedade aos construtores das classes derivadas.
Classe de funcionário
Em primeiro lugar, adicione o objeto de data à lista de membros de dados da classe, atualize a declaração do construtor e adicione novas funções setter e getter:
class Employee {
public:
Employee(const string&, const string&, const string&,
const Date&);
...
const Date &getBirthDate() const;
void setBirthDate(const Date &birthDate);
private:
...
Date birthDate;
}
Implemente as funções modificadas/adicionadas:
Employee::Employee(const string &first,
const string &last,
const string &ssn,
const Date &date)
: firstName(first), lastName(last),
socialSecurityNumber(ssn),
birthDate(date) {}
...
const Date &Employee::getBirthDate() const {
return birthDate;
}
void Employee::setBirthDate(const Date &birthDate) {
Employee::birthDate = birthDate;
}
Passo 2
Agora, adicione a propriedade adicional aos construtores das classes derivadas.
Classe de funcionário assalariado
// declaration
class SalariedEmployee : public Employee {
public:
SalariedEmployee(const string&, const string&,
const string&, double = 0.0,
const Date&);
...
private:
...
}
// implementation
SalariedEmployee::SalariedEmployee(const string &first,
const string &last, const string &ssn,
double salary, const Date &date)
: Employee(first, last, ssn, date)
{
setWeeklySalary(salary);
}
Funcionário Horista
// declaration
class HourlyEmployee : public Employee {
public:
HourlyEmployee(const string&, const string&,
const string&, double = 0.0,
double = 0.0, const Date&);
...
private:
...
}
// implementation
HourlyEmployee::HourlyEmployee(const string &first,
const string &last, const string &ssn,
double hourlyWage, double hoursWorked,
const Date &date)
: Employee(first, last, ssn, date)
{
setWage(hourlyWage);
setHours(hoursWorked);
}
ComissãoFuncionário:
// declaration
class CommissionEmployee : public Employee {
public:
CommissionEmployee(const string&, const string&,
const string&, double = 0.0,
double = 0.0, const Date&);
...
private:
...
}
// implementation
CommissionEmployee::CommissionEmployee(
const string &first, const string &last,
const string &ssn, double sales,
double rate, const Date &date)
: Employee(first, last, ssn, date)
{
setGrossSales(sales);
setCommissionRate(rate);
}
Passo 3
BasePlusCommissionEmployee
// declaration
class BasePlusCommissionEmployee
: public CommissionEmployee {
public:
BasePlusCommissionEmployee(const string&,
const string&, const string&,
double = 0.0, double = 0.0,
double = 0.0, const Date&);
...
private:
...
}
// implementation
BasePlusCommissionEmployee::BasePlusCommissionEmployee(
const string &first, const string &last,
const string &ssn, double sales,
double rate, double salary,
const Date &date)
: CommissionEmployee(first, last, ssn, date)
{
setBaseSalary(salary);
}
Demonstração
Antes de demonstrarmos as classes modificadas, precisamos adicionar a função getter para o membro de dados do mês da classe Date para poder acessar o valor do mês, que usaremos para determinar se um funcionário deve receber um bônus ou não:
int Date::getMonth() const {
return month;
}
O arquivo principal para fins de demonstração:
#include iostream>
#include iomanip>
#include
#include "SalariedEmployee.h"
#include "HourlyEmployee.h"
#include "CommissionEmployee.h"
#include "BasePlusCommissionEmployee.h"
using namespace std;
const static int CURRENT_MONTH = 1;
const static int BONUS = 100;
int main()
{
cout fixed setprecision(2);
SalariedEmployee salariedEmployee(
"Amanda", "Nunez", "305-17-1374", 800,
{1, 1, 1992});
HourlyEmployee hourlyEmployee(
"Dawn", "Adams", "407-34-7369", 16.75, 40,
{1, 13, 1993});
CommissionEmployee commissionEmployee(
"Dennis", "Linares", "073-66-7160", 10000, .06,
{6, 13, 1990});
BasePlusCommissionEmployee basePlusCommissionEmployee(
"David", "Trevino", "406-47-9726", 5000, .04, 300,
{8, 27, 1993});
vectorEmployee> employees;
employees.push_back(salariedEmployee);
employees.push_back(hourlyEmployee);
employees.push_back(commissionEmployee);
employees.push_back(basePlusCommissionEmployee);
for (Employee employee : employees)
{
employee.print();
if (employee.getBirthDate().getMonth()
== CURRENT_MONTH)
cout nearned $"
employee.earnings() + BONUS
else
cout nearned$"
employee.earnings()
}
}
Resposta
Ver desenvolvimento.