Revisão de Orientação a Objetos e C++ Remis Balaniuk.

31
Revisão de Orientação a Objetos e C++ Remis Balaniuk

Transcript of Revisão de Orientação a Objetos e C++ Remis Balaniuk.

Page 1: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

Revisão de Orientação a Objetos e C++

Remis Balaniuk

Page 2: 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

Page 3: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

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.

Orientação a objetos

Page 5: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

Orientação a objetos

Page 6: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

Orientação a objetos

Page 7: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

Orientação a objetos

Page 8: Revisão de Orientação a Objetos e C++ Remis Balaniuk.
Page 9: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

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.

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.

#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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.
Page 31: Revisão de Orientação a Objetos e C++ Remis Balaniuk.

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