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

Post on 18-Apr-2015

107 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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