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
Procedural
Subprogram
#1
Main
Program
Data
Subprogram
#2
Subprogram
#3
Subprogram
#4
Subprogram
#5
Object Oriented
Object #1
Data
Object #2
Main
Program
Data
Object #3
Data
Orientação a objetos
Orientação a objetos
Orientação a objetos
Orientação a objetos
Exemplo em C++
Reta
cor : int
espessura : int
Ponto
n
2
posicao : double[2]
cor : int
desenha
RetaPontilhada
espaço : int
desenha
move
RetaTracejada
espaço : int
tipoTraço : int
desenha
Exemplo em C++
Reta.H
Reta.CPP
#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;
};
#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;
}
#endif // __RETA_HEADER__
// indica inicio de comentário
#include
#include “Reta.H”
Insere o arquivo de header.
#include <iostream>
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__Se esta variável não
definida …
// conteúdo of reta.H
//...
define.
#endif
• To ensure it is safe to include a file more than
once.
fim da área protegida.
Includes circulares
gui.H
#include “controller.h”
• O que está
errado ?
// define gui
// ...
controller.H
#include “gui.h”
class Controller
{
//...
private:
Gui* myGui;
//...
};
• Como consertar?
Forward Declarations
gui.H
//Forward Declaration
class Controller;
controller.H
// define
gui
//Forward declaration
// ...
class Gui;
class Controller
{
//...
private:
Gui* myGui;
//...
};
• Num header file,
incluir só o
necessário.
• Se somente
apontadores para
outras classes forem
usados usar forward
declarations.
Compilation
Compiler
Preprocessor
Translates to machine code
Associates calls with functions
Inlines #includes etc.
Object files
Executable
Linker
Associates functions with definitions
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
Ponto.CPP
Ponto.H
#include “Ponto.H”
Ponto::Ponto(double x,double y)
#ifndef __PONTO_HEADER__
{
#define __PONTO_HEADER__
posicao[0]=x;
posicao[1]=y;
class Ponto
}
{
Ponto ::~ Ponto ()
public:
{
Ponto(double x,double y);
}
virtual ~Ponto();
Ponto ::move(double x,double y)
void move(double x,double y);
{
private:
posicao[0]=x;
double posicao[2];
posicao[1]=y;
int
cor;
}
};
#endif // __PONTO_HEADER__
Ponto.H
#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__
Polimorfismo
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 memory
Ponto *p = new Ponto(5, 5);
...
// free the memory
delete 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 /
On the Stack /
Dynamic allocation
Automatic allocation
drawStuff()
drawStuff()
{
{
Ponto *p = new Ponto();
Ponto p();
p->move(10,10);
p.move(5,5);
//...
//...
}
}
Resumo do Header File
header file
Início do header
guard
forward declaration
declaração da classe
constructor
destructor
demais métodos
atributos da classe (não podem
ser acessados diretamente)
não esqueça o ;
final header guard
Reta.H
#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__
Como funciona a herança?
Reta
cor : int
espessura : int
desenha
RetaPontilhada
espaço : int
desenha
RetaTracejada
espaço : int
tipoTraç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 mesmo
nome de método
existente 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