diff --git a/sources/ControladorObras.cpp b/sources/ControladorObras.cpp index 76b457767c049648de8570a225a0bca652d7e6c9..73ab46fdc11e5a2a8ddb15f430d36c51b0c23188 100644 --- a/sources/ControladorObras.cpp +++ b/sources/ControladorObras.cpp @@ -1,5 +1,6 @@ #include <iostream> #include <algorithm> +#include <memory> #include "ControladorObras.hpp" @@ -18,17 +19,17 @@ ControladorObras& ControladorObras::getInstance() { void ControladorObras::mostrarDetalhes() const { cout << endl << "> LISTANDO OBRAS DO SISTEMA:" << endl << endl; for (const auto& obra : this->obras) { - (&obra)->mostrarDetalhes(); + obra.mostrarDetalhes(); cout << endl << "-----" << endl << endl; } } // Methods -pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){ +pair<int, int> ControladorObras::pesquisarObra(shared_ptr<DescricaoObra> descricao){ pair <int, int> p = make_pair(0, 0); auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) { - return descricao.getTitulo() == d.getTitulo(); + return descricao->getTitulo() == d.getTitulo(); }); if (it_obra == this->obras.end()) { @@ -40,22 +41,21 @@ pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){ return p; } -void ControladorObras::adicionarObra(DescricaoObra& descricao){ +void ControladorObras::adicionarObra(shared_ptr<DescricaoObra> descricao) { auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) { - return descricao.getTitulo() == d.getTitulo(); + return descricao->getTitulo() == d.getTitulo(); }); if (it_obra == this->obras.end()) { - Obra obra(descricao); - this->obras.push_back(obra); + this->obras.push_back(Obra(descricao)); } else { it_obra->adicionarObra(); } } -bool ControladorObras::solicitarEmprestimo(DescricaoObra& descricao){ +bool ControladorObras::solicitarEmprestimo(shared_ptr<DescricaoObra> descricao){ auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) { - return descricao.getTitulo() == d.getTitulo(); + return descricao->getTitulo() == d.getTitulo(); }); if (it_obra == this->obras.end()) { @@ -66,9 +66,9 @@ bool ControladorObras::solicitarEmprestimo(DescricaoObra& descricao){ } -bool ControladorObras::devolverEmprestimo(DescricaoObra& descricao){ +bool ControladorObras::devolverEmprestimo(shared_ptr<DescricaoObra> descricao){ auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) { - return descricao.getTitulo() == d.getTitulo(); + return descricao->getTitulo() == d.getTitulo(); }); if (it_obra == this->obras.end()) { diff --git a/sources/ControladorObras.hpp b/sources/ControladorObras.hpp index 757a317288c190bb7b64629a85acd32ed3826238..09dac116e500dfa9fe2c46a3d7273c268f4a67fb 100644 --- a/sources/ControladorObras.hpp +++ b/sources/ControladorObras.hpp @@ -3,6 +3,7 @@ #include <vector> #include <string> +#include <memory> #include "Obra.hpp" #include "DescricaoObra.hpp" @@ -20,10 +21,10 @@ class ControladorObras { // Methods static ControladorObras& getInstance(); void mostrarDetalhes() const; - pair<int, int> pesquisarObra(DescricaoObra& descricao); - void adicionarObra(DescricaoObra& descricao); - bool solicitarEmprestimo(DescricaoObra& descricao); - bool devolverEmprestimo(DescricaoObra& descricao); + pair<int, int> pesquisarObra(shared_ptr<DescricaoObra> descricao); + void adicionarObra(shared_ptr<DescricaoObra> descricao); + bool solicitarEmprestimo(shared_ptr<DescricaoObra> descricao); + bool devolverEmprestimo(shared_ptr<DescricaoObra> descricao); }; diff --git a/sources/ControladorUsuarios.cpp b/sources/ControladorUsuarios.cpp index bb89a168ef1d6fe8e13feb109185298951f99c0f..44d95f19db611d2f81b3cabd372cc8fd42786b73 100644 --- a/sources/ControladorUsuarios.cpp +++ b/sources/ControladorUsuarios.cpp @@ -1,6 +1,7 @@ #include <iostream> #include <algorithm> #include <chrono> +#include <memory> #include "ControladorUsuarios.hpp" #include "Usuario.hpp" @@ -44,7 +45,7 @@ bool ControladorUsuarios::adicionarUsuario(string nome, string CPF, string ender } -chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, DescricaoObra& descricao){ +chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao){ // Search for user auto it = find_if(usuarios.begin(), usuarios.end(), [CPF](Usuario& u) { @@ -65,7 +66,7 @@ chrono::year_month_day ControladorUsuarios::registrarEmprestimo(string CPF, Desc } -int ControladorUsuarios::retornarEmprestimo(string CPF, DescricaoObra& descricao){ +int ControladorUsuarios::retornarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao){ // Search for user auto it = find_if(usuarios.begin(), usuarios.end(), [CPF](Usuario& u) { diff --git a/sources/ControladorUsuarios.hpp b/sources/ControladorUsuarios.hpp index 0a6af4f0f238c9954ce827217e2982ea1710e7b2..28e41e245be002fde9c40997b8f53e2858f17f8d 100644 --- a/sources/ControladorUsuarios.hpp +++ b/sources/ControladorUsuarios.hpp @@ -4,6 +4,7 @@ #include <chrono> #include <string> #include <vector> +#include <memory> #include "DescricaoObra.hpp" #include "Usuario.hpp" @@ -22,8 +23,8 @@ class ControladorUsuarios { // Methods static ControladorUsuarios& getInstance(); bool adicionarUsuario(string nome, string CPF, string endereco, string telefone, string email); - chrono::year_month_day registrarEmprestimo(string CPF, DescricaoObra& descricao); - int retornarEmprestimo(string CPF, DescricaoObra& descricao); + chrono::year_month_day registrarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao); + int retornarEmprestimo(string CPF, shared_ptr<DescricaoObra> descricao); int recuperarMultas(string CPF); bool registrarMultaPaga(string CPF, int valor); diff --git a/sources/DescricaoObra.cpp b/sources/DescricaoObra.cpp index 17653075e4429b36b38b74783f7563ef19697a0e..ed32a486795bb4123ea47b7eae9cf3fa253fecf8 100644 --- a/sources/DescricaoObra.cpp +++ b/sources/DescricaoObra.cpp @@ -1,27 +1,25 @@ #include <iostream> #include "DescricaoObra.hpp" +#include "Livro.hpp" +#include "Periodico.hpp" using namespace std; // Constructor -DescricaoObra::DescricaoObra(const string& tipo, const string& titulo, int ano) - : tipo(tipo), titulo(titulo), anoPublicacao(ano) {} +DescricaoObra::DescricaoObra(const string& titulo, int ano) + : titulo(titulo), anoPublicacao(ano) {} void DescricaoObra::mostrarDetalhes() const { - cout << "Título: " << titulo << "\n"; - cout << "Ano de Publicação: " << anoPublicacao << "\n"; + cout << "Título: " << this->getTitulo() << "\n"; + cout << "Ano de Publicação: " << this->getAnoPublicacao() << "\n"; } // Methods -string DescricaoObra::getTipo() const { - return this->tipo; -} - string DescricaoObra::getTitulo() const { return this->titulo; } int DescricaoObra::getAnoPublicacao() const { return this->anoPublicacao; -} +} \ No newline at end of file diff --git a/sources/DescricaoObra.hpp b/sources/DescricaoObra.hpp index a58d412a563dcc6121d04b4826006b0f9c837b62..c79d5a1b67b548b4e35a043991e43f4887c01139 100644 --- a/sources/DescricaoObra.hpp +++ b/sources/DescricaoObra.hpp @@ -9,20 +9,17 @@ class DescricaoObra { private: protected: - string tipo; string titulo; int anoPublicacao; public: // Contructor - DescricaoObra() {}; - DescricaoObra(const string& tipo, const string& titulo, int ano); - virtual void mostrarDetalhes() const = 0; + DescricaoObra(const string& titulo, int ano); // Methods string getTitulo() const ; - string getTipo() const ; int getAnoPublicacao() const ; + virtual void mostrarDetalhes() const = 0; }; diff --git a/sources/Emprestimo.cpp b/sources/Emprestimo.cpp index 1a6ca08a85dec1f0468f7cf80bac1609b7d05b11..1f6388d9dc276700af505b608905922c4a956237 100644 --- a/sources/Emprestimo.cpp +++ b/sources/Emprestimo.cpp @@ -1,5 +1,6 @@ #include <iostream> #include <chrono> +#include <memory> #include "Emprestimo.hpp" #include "DescricaoObra.hpp" @@ -8,7 +9,7 @@ using namespace std; // Constructor -Emprestimo::Emprestimo(DescricaoObra& descricao) +Emprestimo::Emprestimo(shared_ptr<DescricaoObra> descricao) : descricao(descricao) { const chrono::time_point now{chrono::system_clock::now()}; @@ -21,11 +22,11 @@ Emprestimo::Emprestimo(DescricaoObra& descricao) } void Emprestimo::mostraDetalhes() const { + this->descricao->mostrarDetalhes(); cout << "Data de devolução: "; cout << static_cast<unsigned>(this->dataEmprestimo.day()) << "/"; cout << static_cast<unsigned>(this->dataEmprestimo.month()) << "/"; cout << static_cast<int>(this->dataEmprestimo.year()) << endl; - descricao.mostrarDetalhes(); } @@ -44,5 +45,5 @@ chrono::year_month_day Emprestimo::getDataDevolucao() { } string Emprestimo::getDescricaoTitulo(){ - return this->descricao.getTitulo(); + return this->descricao->getTitulo(); } diff --git a/sources/Emprestimo.hpp b/sources/Emprestimo.hpp index 92394761bc06811e5884c4b2546147d4ad646315..b5ea1967f88c7d1f1a46f2fc7ac0856f563c57c6 100644 --- a/sources/Emprestimo.hpp +++ b/sources/Emprestimo.hpp @@ -2,17 +2,17 @@ #define __EMPRESTIMO__ #include <chrono> +#include <memory> #include "DescricaoObra.hpp" class Emprestimo { private: std::chrono::year_month_day dataEmprestimo; - DescricaoObra &descricao; + shared_ptr<DescricaoObra> descricao; public: // Constructor - Emprestimo(); - Emprestimo(DescricaoObra& descricao); + Emprestimo(shared_ptr<DescricaoObra> descricao); void mostraDetalhes() const; // Methods diff --git a/sources/Livro.cpp b/sources/Livro.cpp index a1996ff5f16eb1a092a87052ebe21fe24daea5c2..87d066307091c04525d7bb9199dc3e30990dded1 100644 --- a/sources/Livro.cpp +++ b/sources/Livro.cpp @@ -5,15 +5,18 @@ using namespace std; -Livro::Livro(const DescricaoObra& outro) { - if (outro.getTipo() == "livro") { - Livro l = static_cast<Livro>(outro); - Livro(l.getTitulo(), l.getAnoPublicacao(), l.getAutor(), l.getEditora()); +Livro::Livro(const DescricaoObra& outro) + : DescricaoObra(outro.getTitulo(), outro.getAnoPublicacao()) +{ + const Livro* l = dynamic_cast<const Livro*>(&outro); + if (l != nullptr) { + this->autor = l->getAutor(); + this->editora = l->getEditora(); } } Livro::Livro(const string& t, int ano, const string& a, const string& e) - : DescricaoObra("livro", t, ano), autor(a), editora(e) {} + : DescricaoObra(t, ano), autor(a), editora(e) {} // Description void Livro::mostrarDetalhes() const { @@ -29,4 +32,4 @@ string Livro::getAutor() const { string Livro::getEditora() const { return this->editora; -} +} \ No newline at end of file diff --git a/sources/Livro.hpp b/sources/Livro.hpp index f3b8d4182c9762f2edd546f8364f0f2536907179..65e698b1386d23860a9d78caad4bde4e28a4b02e 100644 --- a/sources/Livro.hpp +++ b/sources/Livro.hpp @@ -20,7 +20,6 @@ class Livro: public DescricaoObra { // Methods string getAutor() const ; string getEditora() const ; - }; #endif // !__LIVRO__ diff --git a/sources/Obra.cpp b/sources/Obra.cpp index 333ef874e1a8e67a4381fa3986a6701ad99f24d4..db17acc4ff35dd1cab5e1be5d35615727ae662d4 100644 --- a/sources/Obra.cpp +++ b/sources/Obra.cpp @@ -6,11 +6,11 @@ #include "Periodico.hpp" // Constructor -Obra::Obra(DescricaoObra& descricao) +Obra::Obra(shared_ptr<DescricaoObra> descricao) : descricao(descricao), disponiveis(1), total(1) {} void Obra::mostrarDetalhes() const { - this->descricao.mostrarDetalhes(); + this->descricao->mostrarDetalhes(); std::cout << "Quantidade disponivel: " << disponiveis << "\n"; std::cout << "Quantidade total: " << total << "\n"; } @@ -40,7 +40,7 @@ void Obra::adicionarObra(){ } string Obra::getTitulo() { - return this->descricao.getTitulo(); + return this->descricao->getTitulo(); } int Obra::getDisponiveis(){ diff --git a/sources/Obra.hpp b/sources/Obra.hpp index 9ce0c8af569ce62e9198c110e95819a84f950c1f..a68ed09dbd2f0f0fa26a766ae29fb003607bc5bc 100644 --- a/sources/Obra.hpp +++ b/sources/Obra.hpp @@ -1,18 +1,18 @@ #ifndef __OBRA__ #define __OBRA__ +#include <memory> #include "DescricaoObra.hpp" class Obra { private: - DescricaoObra& descricao; + shared_ptr<DescricaoObra> descricao; int disponiveis; int total; public: // Contructor - Obra(); - Obra(DescricaoObra& descricao); + Obra(shared_ptr<DescricaoObra> descricao); void mostrarDetalhes() const; // Methods diff --git a/sources/Periodico.cpp b/sources/Periodico.cpp index b1b0e62e79151b17db0b5194d23ee6d2353c1e2b..ce93ab52e07609c7f9eb52ba66dee1ff2596c2ec 100644 --- a/sources/Periodico.cpp +++ b/sources/Periodico.cpp @@ -3,15 +3,18 @@ #include "Periodico.hpp" // Contructor -Periodico::Periodico(const DescricaoObra& outro) { - if (outro.getTipo() == "livro") { - Periodico p = static_cast<Periodico>(outro); - Periodico(p.getTitulo(), p.getAnoPublicacao(), p.getVolume(), p.getMes()); +Periodico::Periodico(const DescricaoObra& outro) + : DescricaoObra(outro.getTitulo(), outro.getAnoPublicacao()) +{ + const Periodico* p = dynamic_cast<const Periodico*>(&outro); + if (p != nullptr) { + this->volume = p->getVolume(); + this->mes = p->getMes(); } } Periodico::Periodico(const std::string& t, int ano, int vol, int m) - : DescricaoObra("periodico", t, ano), volume(vol), mes(m) {} + : DescricaoObra(t, ano), volume(vol), mes(m) {} void Periodico::mostrarDetalhes() const { DescricaoObra::mostrarDetalhes(); @@ -26,4 +29,4 @@ int Periodico::getVolume() const { int Periodico::getMes() const { return this->mes; -} +} \ No newline at end of file diff --git a/sources/Periodico.hpp b/sources/Periodico.hpp index 879a3109c771fcd08dfb8a57ae0e8581ca892e30..fad54aae33be92c9395332cda729b1a6e1b78a2b 100644 --- a/sources/Periodico.hpp +++ b/sources/Periodico.hpp @@ -19,7 +19,6 @@ class Periodico: public DescricaoObra { // Methods int getVolume() const; int getMes() const; - }; diff --git a/sources/Usuario.cpp b/sources/Usuario.cpp index 4864d5127cb18854a8c08d8f179db14d9d56341d..13569d11638f3305916d716a4ef0fe93c4076c85 100644 --- a/sources/Usuario.cpp +++ b/sources/Usuario.cpp @@ -2,6 +2,7 @@ #include <iostream> #include <algorithm> #include <chrono> +#include <memory> #include "Emprestimo.hpp" #include "Usuario.hpp" @@ -25,7 +26,7 @@ void Usuario::mostrarDetalhes() const { // Methods -chrono::year_month_day Usuario::emprestar(DescricaoObra& descricao){ +chrono::year_month_day Usuario::emprestar(shared_ptr<DescricaoObra> descricao){ // Check number of Borrowed works if (this->emprestimos->size() >= 3) { @@ -45,11 +46,11 @@ chrono::year_month_day Usuario::emprestar(DescricaoObra& descricao){ } } -bool Usuario::devolver(DescricaoObra& descricao){ +bool Usuario::devolver(shared_ptr<DescricaoObra> descricao){ // Search for Borrowed work auto emp_it = find_if(this->emprestimos->begin(), this->emprestimos->end(), [&descricao](Emprestimo& emp){ - return emp.getDescricaoTitulo() == descricao.getTitulo(); + return emp.getDescricaoTitulo() == descricao->getTitulo(); }); if (emp_it == this->emprestimos->end()){ diff --git a/sources/Usuario.hpp b/sources/Usuario.hpp index eac1f58fba0a291e9516d40d924481b7b13103a2..15bdace32e64aa2706e0dfc45e9bb63b0f120a5f 100644 --- a/sources/Usuario.hpp +++ b/sources/Usuario.hpp @@ -4,6 +4,7 @@ #include <string> #include <vector> #include <chrono> +#include <memory> #include "DescricaoObra.hpp" #include "Emprestimo.hpp" @@ -28,8 +29,8 @@ class Usuario { void mostrarDetalhes() const; // Methods - std::chrono::year_month_day emprestar(DescricaoObra& descricao); - bool devolver(DescricaoObra& descricao); + std::chrono::year_month_day emprestar(shared_ptr<DescricaoObra> descricao); + bool devolver(shared_ptr<DescricaoObra> descricao); int atualizarMulta(int valor); // Increase fee string getCPF(); int getMulta(); diff --git a/sources/main.cpp b/sources/main.cpp index 6da14af43610febb4a7751f7b649a5f5e0e80fe9..0b5ae75f0da0c49cf0d116197637a7949701a119 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -1,6 +1,7 @@ #include <iostream> #include <string> #include <limits> +#include <memory> #include "Biblioteca.hpp" #include "Livro.hpp" @@ -82,13 +83,11 @@ int main(){ // Cria Periodicos cout << "> Criando Periodicos" << endl; - Periodico p("Revista de Ciência", 2023, 5, 3); - contObras.adicionarObra(p); + contObras.adicionarObra(make_shared<Periodico>("Revista de Ciência", 2023, 5, 3)); // Cria Livros cout << "> Criando Livros" << endl; - Livro l("C++ Programming", 2022, "John Doe", "Tech Books"); - contObras.adicionarObra(l); + contObras.adicionarObra(make_shared<Livro>("C++ Programming", 2022, "John Doe", "Tech Books")); contObras.mostrarDetalhes(); @@ -142,15 +141,13 @@ int main(){ cout << "Entre com o ano: "; cin >> ano; cout << "Entre com o volume: "; cin >> volume; cout << "Entre com o mês: "; cin >> mes; - Periodico per(titulo, ano, volume, mes); - contObras.adicionarObra(per); + contObras.adicionarObra(make_shared<Periodico>(titulo, ano, volume, mes)); } else if (tipoObra == "livro") { cout << "Entre com o titulo: "; getline(cin, titulo); cout << "Entre com o ano: "; cin >> ano; cin.ignore(); cout << "Entre com o autor: "; getline(cin, autor); cout << "Entre com o editora: "; getline(cin, editora); - Livro liv(titulo, ano, autor, editora); - contObras.adicionarObra(liv); + contObras.adicionarObra(make_shared<Livro>(titulo, ano, autor, editora)); } else { cout << "Erro: Tipo não recinhecido! Ignorando operação" << endl; } break; @@ -176,15 +173,13 @@ int main(){ cout << "Entre com o ano: "; cin >> ano; cout << "Entre com o volume: "; cin >> volume; cout << "Entre com o mês: "; cin >> mes; - Periodico per(titulo, ano, volume, mes); - contObras.solicitarEmprestimo(per); + contObras.solicitarEmprestimo(make_shared<Periodico>(titulo, ano, volume, mes)); } else if (tipoObra == "livro") { cout << "Entre com o titulo: "; getline(cin, titulo); cout << "Entre com o ano: "; cin >> ano; cin.ignore(); cout << "Entre com o autor: "; getline(cin, autor); cout << "Entre com o editora: "; getline(cin, editora); - Livro liv(titulo, ano, autor, editora); - contObras.solicitarEmprestimo(liv); + contObras.solicitarEmprestimo(make_shared<Livro>(titulo, ano, autor, editora)); } else { cout << "Erro: Tipo não reconhecido! Ignorando operação" << endl; } break; @@ -195,15 +190,13 @@ int main(){ cout << "Entre com o ano: "; cin >> ano; cout << "Entre com o volume: "; cin >> volume; cout << "Entre com o mês: "; cin >> mes; - Periodico per(titulo, ano, volume, mes); - contObras.devolverEmprestimo(per); + contObras.devolverEmprestimo(make_shared<Periodico>(titulo, ano, volume, mes)); } else if (tipoObra == "livro") { cout << "Entre com o titulo: "; getline(cin, titulo); cout << "Entre com o ano: "; cin >> ano; cin.ignore(); cout << "Entre com o autor: "; getline(cin, autor); cout << "Entre com o editora: "; getline(cin, editora); - Livro liv(titulo, ano, autor, editora); - contObras.devolverEmprestimo(liv); + contObras.devolverEmprestimo(make_shared<Livro>(titulo, ano, autor, editora)); } else { cout << "Erro: Tipo não reconhecido! Ignorando operação" << endl; } break;