revisão de orientação a objetos e c++ remis balaniuk
TRANSCRIPT
![Page 1: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/1.jpg)
Revisão de Orientação a Objetos e C++
Remis Balaniuk
![Page 2: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/2.jpg)
Bibliografia
• http://www.inf.pucrs.br/~manssour/LinguagemC++/• ECKEL, Bruce, C++ Guia do Usuário. Makron
Books, 1991.• WIENER, Richard S.; PINSON, Lewis. C++
Programação Orientada para Objeto – Manual Prático e Profissional. Makron Books, 1991.
• http://www.brasil.terravista.pt/magoito/2090/C.html
![Page 3: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/3.jpg)
Procedural vs. O-O
Main Program
Data
Subprogram #1 Subprogram
#2
Subprogram #3 Subprogram
#4
Subprogram #5
Procedural
Main Program
Object #3
Data
Object #2
Data
Object #1
Data Object Oriented
![Page 4: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/4.jpg)
Orientação a objetos
![Page 5: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/5.jpg)
Orientação a objetos
![Page 6: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/6.jpg)
Orientação a objetos
![Page 7: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/7.jpg)
Orientação a objetos
![Page 8: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/8.jpg)
![Page 9: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/9.jpg)
Exemplo em C++
Reta
cor : intespessura : int
desenha
Ponto
posicao : double[2]cor : int
move2n
RetaPontilhada
espaço : int
desenha
RetaTracejada
espaço : inttipoTraço : int
desenha
![Page 10: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/10.jpg)
Exemplo em C++
#ifndef __RETA_HEADER__#define __RETA_HEADER__class Ponto;class Reta{public: Reta(); virtual ~Reta(); virtual void desenha();private: Ponto *m_p0, *m_p1; int cor, espessura;};#endif // __RETA_HEADER__
Reta.H#include “Reta.H”#include “Ponto.H”
Reta::Reta(){ m_p0 = new Ponto(0, 0); m_p1 = new Ponto(1, 1);}Reta::~Reta(){ delete m_p0; delete m_p1;}
Reta.CPP
// indica inicio de comentário
![Page 11: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/11.jpg)
#include “Reta.H”
#include <iostream>
#include
Insere o arquivo de header.
Inclui um library header.
![Page 12: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/12.jpg)
Header Guards
#ifndef __RETA_HEADER__#define __RETA_HEADER__
// conteúdo of Reta.H//...
#endif
• Garante que o conteúdo do header vai ser incluído uma única vez mesmo que o include seja chamado mais de uma vez.
![Page 13: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/13.jpg)
Header Guards
#ifndef __RETA_HEADER__#define __RETA_HEADER__
// conteúdo of reta.H//...
#endif
• To ensure it is safe to include a file more than once.
Se esta variável não definida …
define.
fim da área protegida.
![Page 14: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/14.jpg)
Includes circulares
• O que está errado ?
• Como consertar?
#include “controller.h”
// define gui// ...
gui.H
#include “gui.h”
class Controller{//...private: Gui* myGui;//...};
controller.H
![Page 15: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/15.jpg)
Forward Declarations
• Num header file, incluir só o necessário.
• Se somente apontadores para outras classes forem usados usar forward declarations.
//Forward Declarationclass Controller;
// define gui// ...
gui.H
//Forward declaration
class Gui;
class Controller{//...private: Gui* myGui;//...};
controller.H
![Page 16: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/16.jpg)
Compilation
PreprocessorInlines #includes etc.
CompilerTranslates to machine code
Associates calls with functions
LinkerAssociates functions with definitions
Object files
Executable
External Libraries, libc.so, libcs123.so
![Page 17: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/17.jpg)
Exemplo
• Escreva os arquivos Ponto.h e Ponto.cpp que descreva a classe Ponto.
Ponto
posicao : double[2]cor : int
move
![Page 18: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/18.jpg)
Solução
#ifndef __PONTO_HEADER__#define __PONTO_HEADER__
class Ponto{public: Ponto(double x,double y); virtual ~Ponto(); void move(double x,double y);private: double posicao[2]; int cor;};#endif // __PONTO_HEADER__
Ponto.H #include “Ponto.H”Ponto::Ponto(double x,double y){
posicao[0]=x;posicao[1]=y;
}Ponto ::~ Ponto (){}Ponto ::move(double x,double y){
posicao[0]=x;posicao[1]=y;
}
Ponto.CPP
![Page 19: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/19.jpg)
Polimorfismo#ifndef __PONTO_HEADER__#define __PONTO_HEADER__
class Ponto{public: Ponto(); Ponto(double x,double y); virtual ~Ponto(); void move(double x,double y); void move(double novapos[2]);private: double posicao[2]; int cor;};#endif // __PONTO_HEADER__
Ponto.H
![Page 20: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/20.jpg)
Alocando memória usando new
Ponto *p = new Ponto(5, 5);
• new pode ser visto como uma função• new aloca o espaço para o objeto.• new chama o construtor do objeto.• new retorna um ponteiro para o objeto.
![Page 21: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/21.jpg)
Desalocando memória usando delete
// allocate memoryPonto *p = new Ponto(5, 5);
...// free the memorydelete p;
Para toda chamada do new, deve existir uma chamada do delete.
![Page 22: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/22.jpg)
Destructors
• delete chama o destructor do objeto.• delete libera o espaço ocupado pelo
objeto.
• Libera recursos (memória).
![Page 23: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/23.jpg)
Destructors – um exemplo
class Reta{public: Reta(); virtual ~Reta();private: Ponto *m_p0, *m_p1;};
![Page 24: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/24.jpg)
Destructors – um exemplo
Reta:: Reta(){ m_p0 = new Ponto(0, 0); m_p1 = new Ponto(1, 1);}Reta ::~Reta(){ delete m_p0; delete m_p1;}
![Page 25: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/25.jpg)
Usando o “->”
Ponto *p = new Ponto(5, 5);
// acessando uma função:
(*p).move(10, 10);
// ou simplesmente:
p->move(10, 10);
![Page 26: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/26.jpg)
Stack vs. Heap
On the Heap / Dynamic allocation
On the Stack / Automatic allocation
drawStuff()
{
Ponto *p = new Ponto();
p->move(10,10);
//...
}
drawStuff()
{
Ponto p();
p.move(5,5);
//...
}
![Page 27: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/27.jpg)
Resumo do Header File
Início do header guard
header file
forward declaration
declaração da classe
constructor
destructor
final header guard
atributos da classe (não podem ser acessados diretamente)
não esqueça o ;
#ifndef __RETA_HEADER__#define __RETA_HEADER__class Ponto;class Reta{public: Reta(); virtual ~Reta(); virtual void desenhar();private: Ponto *m_p0, *m_p1; int cor, espessura;};#endif // __RETA_HEADER__
Reta.H
demais métodos
![Page 28: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/28.jpg)
Como funciona a herança?
Reta
cor : intespessura : int
desenha
RetaPontilhada
espaço : int
desenha
RetaTracejada
espaço : inttipoTraço : int
desenha
![Page 29: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/29.jpg)
Como funciona a herança?Precisa incluir o header da classe pai aqui
RetaPontilhada herda propriedades de Reta (cor,espessura e pontos)
#include “Reta.H”class RetaPontilhada : public Reta{ public: RetaPontilhada(); virtual ~RetaPontilhada(); void desenhar(); private: int espaço;};
Método de mesmonome de métodoexistente no pai: sobrepõe
![Page 30: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/30.jpg)
![Page 31: Revisão de Orientação a Objetos e C++ Remis Balaniuk](https://reader035.vdocuments.net/reader035/viewer/2022062418/552fc13b497959413d8d9388/html5/thumbnails/31.jpg)
Usando o Borland C++ Builder• Criando uma nova aplicação:
– File – New – other... – console wizard – OK– File – Save as – (escolha diretorio e nome) - OK
• Criando uma nova classe:– File – New – Unit– File – Save as – (escolha nome da classe) – OK– Edite o .h com as definições da classe– Edite o .cpp com os métodos
• Dentro do main coloque só as criações de objetos e chamadas principais
• Para gerar executável:– Project – Build project
• Para executar:– Seta verde