#include #include class Colaborador { struct Comissionado { std::string cargo; double comissao; }; std::string _nome; std::string _funcao; double _salario; Comissionado *_com_ptr{nullptr}; public: Colaborador() = default; Colaborador(std::string nome, std::string funcao, double salario) : _nome(nome), _funcao(funcao), _salario(salario) {} Colaborador(Colaborador const &c) : _nome(c._nome), _funcao(c._funcao), _salario(c._salario), _com_ptr(nullptr) { if (c._com_ptr) { _com_ptr = new Comissionado{c._com_ptr->cargo, c._com_ptr->comissao}; } } Colaborador(Colaborador &&c) : _nome(c._nome), _funcao(c._funcao), _salario(c._salario), _com_ptr(c._com_ptr) { c._com_ptr = nullptr; } Colaborador &operator=(Colaborador const &c); Colaborador &operator=(Colaborador &&c); std::string nome() const { return _nome; } std::string funcao() const { auto res{_funcao}; if (_com_ptr) { res += " [" + _com_ptr->cargo + "]"; } return res; } double a_pagar() const { auto res{_salario}; if (_com_ptr) { res += _com_ptr->comissao; } return res; } void deixa_comissao() { if (_com_ptr) { delete _com_ptr; } _com_ptr = nullptr; } void recebe_comissao(std::string cargo, double comissao) { deixa_comissao(); _com_ptr = new Comissionado{cargo, comissao}; } ~Colaborador() { delete _com_ptr; } }; Colaborador &Colaborador::operator=(Colaborador const &c) { if (&c != this) { _nome = c._nome; _funcao = c._funcao; _salario = c._salario; if (_com_ptr) { delete _com_ptr; _com_ptr = nullptr; } if (c._com_ptr) { _com_ptr = new Comissionado{c._com_ptr->cargo, c._com_ptr->comissao}; } } return *this; } Colaborador &Colaborador::operator=(Colaborador &&c) { if (&c != this) { _nome = c._nome; _funcao = c._funcao; _salario = c._salario; delete _com_ptr; _com_ptr = c._com_ptr; c._com_ptr = nullptr; } return *this; } int main(int, char *[]) { Colaborador marcio("Marcio Ferreira", "vendedor", 2500); Colaborador joana("Joana Ponte", "vendedor", 2500); joana.recebe_comissao("chefe de vendedores", 500); Colaborador joana2{joana}; joana2.deixa_comissao(); Colaborador joana3; joana3 = joana; joana3.deixa_comissao(); std::cout << marcio.nome() << " recebe " << marcio.a_pagar() << std::endl; std::cout << joana.nome() << " recebe " << joana.a_pagar() << std::endl; std::cout << joana2.nome() << " recebe " << joana2.a_pagar() << std::endl; std::cout << joana3.nome() << " recebe " << joana3.a_pagar() << std::endl; }