revisão de orientação a objetos e c++ remis balaniuk

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

Upload: internet

Post on 18-Apr-2015

107 views

Category:

Documents


0 download

TRANSCRIPT

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