From c77d46261537fd612dd5555a70eb10daf40311a3 Mon Sep 17 00:00:00 2001
From: Nico <nico.igramos@gmail.com>
Date: Sat, 7 Dec 2024 15:32:44 -0300
Subject: [PATCH] Descricao da obra alterado para ser um shared_ptr

---
 sources/ControladorObras.cpp    | 22 +++++++++++-----------
 sources/ControladorObras.hpp    |  9 +++++----
 sources/ControladorUsuarios.cpp |  5 +++--
 sources/ControladorUsuarios.hpp |  5 +++--
 sources/DescricaoObra.cpp       | 16 +++++++---------
 sources/DescricaoObra.hpp       |  7 ++-----
 sources/Emprestimo.cpp          |  7 ++++---
 sources/Emprestimo.hpp          |  6 +++---
 sources/Livro.cpp               | 15 +++++++++------
 sources/Livro.hpp               |  1 -
 sources/Obra.cpp                |  6 +++---
 sources/Obra.hpp                |  6 +++---
 sources/Periodico.cpp           | 15 +++++++++------
 sources/Periodico.hpp           |  1 -
 sources/Usuario.cpp             |  7 ++++---
 sources/Usuario.hpp             |  5 +++--
 sources/main.cpp                | 25 +++++++++----------------
 17 files changed, 78 insertions(+), 80 deletions(-)

diff --git a/sources/ControladorObras.cpp b/sources/ControladorObras.cpp
index 76b4577..73ab46f 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 757a317..09dac11 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 bb89a16..44d95f1 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 0a6af4f..28e41e2 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 1765307..ed32a48 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 a58d412..c79d5a1 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 1a6ca08..1f6388d 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 9239476..b5ea196 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 a1996ff..87d0663 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 f3b8d41..65e698b 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 333ef87..db17acc 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 9ce0c8a..a68ed09 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 b1b0e62..ce93ab5 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 879a310..fad54aa 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 4864d51..13569d1 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 eac1f58..15bdace 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 6da14af..0b5ae75 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;
 
-- 
GitLab