Revisão de Orientação a Objetos e C++
Remis Balaniuk
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
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
Orientação a objetos
Orientação a objetos
Orientação a objetos
Orientação a objetos
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
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
#include “Reta.H”
#include <iostream>
#include
Insere o arquivo de header.
Inclui um library header.
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.
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.
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
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
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
Exemplo
• Escreva os arquivos Ponto.h e Ponto.cpp que descreva a classe Ponto.
Ponto
posicao : double[2]cor : int
move
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
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
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.
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.
Destructors
• delete chama o destructor do objeto.• delete libera o espaço ocupado pelo
objeto.
• Libera recursos (memória).
Destructors – um exemplo
class Reta{public: Reta(); virtual ~Reta();private: Ponto *m_p0, *m_p1;};
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;}
Usando o “->”
Ponto *p = new Ponto(5, 5);
// acessando uma função:
(*p).move(10, 10);
// ou simplesmente:
p->move(10, 10);
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);
//...
}
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
Como funciona a herança?
Reta
cor : intespessura : int
desenha
RetaPontilhada
espaço : int
desenha
RetaTracejada
espaço : inttipoTraço : int
desenha
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
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
Top Related