Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução
Introdução Introdução
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 3 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 4
Introdução Introdução
Exemplo 1 Exemplo 1
int main() { 10 20
10 30
ClasseTeste c1; 10 30
class ClasseTeste {
public: c1.x = 10;
int x, *p; *c1.p = 20;
c1 c2
c1.display();
ClasseTeste() {
x *p x *p
this->p = new int; ClasseTeste c2 = c1;
} 10 10
*c2.p = 30;
c2.display();
void display() {
cout << this->x << " " << *this->p << endl;
} c1.display();
};
20
return 0;
}
30
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 5 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 6
1
13/05/2019
Introdução Introdução
Exemplo 1
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 7 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 8
Introdução Introdução
Exemplo 2
ClasseTeste() {
~ClasseTeste() {
▪ Remoção por um ponteiro base, sem dtor virtual delete this->x;
delete this->p;
}
};
https://wandbox.org/permlink/rD11A24OmEPMUy8U
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 9 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 10
Introdução Introdução
Exemplo 3 Exemplo 3
Circunferencia.hpp
main.cpp
#ifndef M_PI
#define M_PI 3.14159265358979323846 #include <iostream>
#endif
#include "Ponto.hpp"
#ifndef CIRCUNFERENCIA_H Circunferencia.cpp #include "Circunferencia.hpp"
#define CIRCUNFERENCIA_H
#include "Circunferencia.hpp"
using namespace std;
#include <cmath>
Circunferencia::Circunferencia(Ponto* centro, double raio) {
#include "Ponto.hpp" this->_centro = centro; int main() {
this->_raio = raio;
class Circunferencia { } Circunferencia* c1 = new Circunferencia(new Ponto(), 10);
cout << c1->calcularArea() << endl;
public: Circunferencia::~Circunferencia() {
Ponto* _centro; delete this->_centro;
Ponto p(5.0, 5.0);
• Ponteiro externo?
}
Circunferencia* c2 = new Circunferencia(&p, •10);
double _raio; Instanciar dentro de Circunferencia?
Circunferencia(Ponto* centro, double raio); double Circunferencia::calcularArea() { cout << c2->calcularArea() << endl;
~Circunferencia(); return M_PI * pow(this->_raio, 2);
} delete c1;
double calcularArea(); delete c2;
};
return 0;
#endif
}
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 11 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 12
2
13/05/2019
▪ Construtor de cópia
return 0;
~Test() { }
▪ Operador de cópia
cout << “Destructor called." << endl;
}
Constructor called.
▪ Se a versão gerada pelo compilador para uma não se Test(const Test &t) {
cout << "Copy constructor called." << endl; Constructor called.
ajusta às necessidades da classe em questão, então } Assignment operator called.
Copy constructor called.
provavelmente as outras funções padrões também não Test& operator = (const Test &t) {
cout << "Assignment operator called." << endl; Destructor called.
return *this;
}
Destructor called.
}; Destructor called.
https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 13 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 14
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 15 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 16
▪ std::unique_ptr
▪ Possui um recurso alocado dinamicamente class ClasseA {
▪ Apenas ele pode apontar para o recurso public:
int id;
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 17 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 18
3
13/05/2019
c3 = nullptr;
return 0; cout << c2.use_count() << endl;
}
return 0;
https://wandbox.org/permlink/n9tEfvcvNELNSkGZ }
https://wandbox.org/permlink/xnJ8jOmmBwsYH7Zb
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 19 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 20
class Animal {
#include <list> Au! Au!
public:
virtual void fale() {
int main() {
Miau!
cout << "Fale padrao!" << endl;
}; Au! Au!
list<Animal*> lista; Miau!
~Animal() {
cout << "Animal::Destructor" << endl; Au! Au!
}
for(int i=0; i<5;i++) {
}; if (i % 2 == 0)
lista.push_back(new Cachorro());
else
Memory Leak!
lista.push_back(new Gato()); Nenhum destrutor é chamado!
class Gato : public Animal { class Cachorro : public Animal {
public: public: }
void fale() override { void fale() override {
cout << "Miau!" << endl; cout << "Au! Au!" << endl; for (auto a : lista)
} } a->fale();
~Gato() { ~Cachorro() {
cout << "Gato::Destructor" << endl; cout << "Cachorro::Destructor" << endl; return 0;
} } }
}; };
PDS 2 - Programação Orientada a Objetos (Polimorfismo – 1/2) 21 PDS 2 - Programação Orientada a Objetos (Polimorfismo – 1/2) 22
PDS 2 - Programação Orientada a Objetos (Polimorfismo – 1/2) 23 PDS 2 - Programação Orientada a Objetos (Polimorfismo – 1/2) 24
4
13/05/2019
Exercício Exercício
MensagemBase
- data
- status
Vai ter aula de PDS hj? + exibir()
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 25 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 26
Exercício Exercício
MensagemBase.hpp
#ifndef MENSAGEMBASE_H
#define MENSAGEMBASE_H
enum MsgStatus {
#include "MensagemBase.hpp"
NONE,
SENT, MensagemBase::MensagemBase() {
DELIVERED,
READ
this->_data = std::time(nullptr);
}; this->_status = MsgStatus::NONE;
}
class MensagemBase {
};
#endif
https://en.cppreference.com/w/cpp/language/enum https://en.cppreference.com/w/cpp/language/enum
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 27 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 28
Exercício Exercício
Chat.hpp Chat.cpp
#ifndef CHAT_H #include "Chat.hpp"
#define CHAT_H
void Chat::enviarMensagem(MensagemBase *msg) {
#include <list> this->_historico.push_back(msg);
}
#include <iostream>
void Chat::exibirMensagens() {
#include "MensagemBase.hpp" for (auto m : this->_historico) {
time_t d = m->getData();
#include "MensagemTexto.hpp" char data[20];
#include "MensagemImagem.hpp" strftime(data, 20, "%Y-%m-%d %H:%M:%S", localtime(&d));
#include "MensagemAudio.hpp"
std::cout << "(" << data << ", " << m->getStatus() << ")" << std::endl;
m->exibir();
class Chat { }
}
private:
std::list<MensagemBase*> _historico; void Chat::enviarMensagemTexto(std::string texto) {
MensagemTexto *msg = new MensagemTexto(texto);
void enviarMensagem(MensagemBase* msg);
this->enviarMensagem(msg);
}
public:
void exibirMensagens(); void Chat::enviarMensagemImagem(std::string imagem) {
MensagemImagem *msg = new MensagemImagem(imagem);
void enviarMensagemTexto(std::string texto); this->enviarMensagem(msg);
}
void enviarMensagemImagem(std::string imagem);
void enviarMensagemAudio(std::string audio); void Chat::enviarMensagemAudio(std::string audio) {
MensagemAudio *msg = new MensagemAudio(audio);
}; this->enviarMensagem(msg);
}
#endif
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 29 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 30
5
13/05/2019
Exercício Exercício
. project
├── Makefile
├── build
main.cpp ├── include
│ └── chat
#include "Chat.hpp"
│ └── Chat.hpp
int main() { │ └── mensagem
│ └── MensagemBase.hpp
Chat chat; │ └── MensagemAudio.hpp
│ └── MensagemImagem.hpp
chat.enviarMensagemTexto("Oi, tem aula de PDS2 hoje?"); │ └── MensagemTexto.hpp
chat.enviarMensagemAudio("audio.wav"); └── imgfiles
chat.enviarMensagemImagem("imagem03.ascii"); └── src
chat.enviarMensagemTexto("Mas que puxa :("); │ └── main.cpp
│ └── chat
chat.exibirMensagens();
│ └── Chat.cpp
│ └── mensagem
return 0;
}
│ └── MensagemBase.cpp
│ └── MensagemAudio.cpp
│ └── MensagemImagem.cpp
│ └── MensagemTexto.cpp
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 31 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 32
Exercício Exercício
MensagemBase
- data
- status
+ exibir()
MensagemImagemTexto
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 33 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 34
Exercício Exercício
▪ Tarefas
MensagemBase
- data
▪ Modifique Chat
- data
- status
MensagemImagem + exibir()
▪ Enviar MensagemImagemComTexto
▪ Alterar o Status das mensagens
- imagem
MensagemImagemComTexto
- msgImagem ▪ Como especializar Chat?
- msgTexto ▪ Conversa Individual / Grupo
▪ Verifique (corrija) a presença de memory leaks
MensagemImagemComTexto
- msgTexto
▪ Modifique para utilizar smart_pointers
PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 35 PDS 2 - Programação Orientada a Objetos (Gerenciando Memória) 36