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.