#include #include #include class Colaborador { struct Comissionado { std::string cargo; double comissao; Comissionado(std::string c, double v) : cargo(c), comissao(v) {} }; struct PonteiroComissao { std::unique_ptr ptr; PonteiroComissao() = default; PonteiroComissao(std::string cargo, double comissao) { ptr = std::make_unique(cargo, comissao); } PonteiroComissao(PonteiroComissao const &pc) { ptr = std::make_unique(pc.ptr->cargo, pc.ptr->comissao); } PonteiroComissao(PonteiroComissao &&pc) : ptr(std::move(pc.ptr)) {} PonteiroComissao &operator=(PonteiroComissao const &pc) { if (&pc != this) { auto tmp{ std::make_unique(pc.ptr->cargo, pc.ptr->comissao)}; ptr = std::move(tmp); } return *this; } PonteiroComissao &operator=(PonteiroComissao &&pc) { ptr = std::move(pc.ptr); return *this; } }; std::string _nome; std::string _funcao; double _salario; PonteiroComissao _com; public: Colaborador() = default; Colaborador(std::string nome, std::string funcao, double salario) : _nome(nome), _funcao(funcao), _salario(salario) {} 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() { _com.ptr.reset(); } void recebe_comissao(std::string cargo, double comissao) { _com = PonteiroComissao(cargo, comissao); } }; 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; }