Revisão de Orientação a Objetos e C++ Remis Balaniuk
Bibliografia http://www.brasil.terravista.pt/magoito/2090/C.html 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 Object Oriented Subprogram #1 Subprogram Main Program Data Subprogram #2 Subprogram #3 Subprogram #4 Subprogram #5 Object #1 Object Oriented 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++ n 2 Reta Ponto cor : int espessura : int posicao : double[2] cor : int n 2 desenha move RetaPontilhada RetaTracejada espaço : int espaço : int tipoTraço : int desenha desenha
// indica inicio de comentário 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 Declarations go in .H file Definitions go in .C file Good because: can see interface without implementations lets others use your functions etc. // indica inicio de comentário
#include #include “Reta.H” Insere o arquivo de header. #include <iostream> 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? gui.H #include “controller.h” // define gui // ... gui.H #include “gui.h” class Controller { //... private: Gui* myGui; }; controller.H Answer: To avoid circular includes,
Forward Declarations Num header file, incluir só o necessário. gui.H Se somente apontadores para outras classes forem usados usar forward declarations. //Forward Declaration class Controller; // define gui // ... gui.H //Forward declaration class Gui; class Controller { //... private: Gui* myGui; }; controller.H Minimize compile dependency. Speeds up compilation. (don’t need to recompile every time gui.H changes)
Compilation Compiler Preprocessor Linker Object files Executable Inlines #includes etc. Compiler Translates to machine code Associates calls with functions Object files Linker Associates functions with definitions 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 Ponto.CPP 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) Ponto.CPP #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
Polimorfismo 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__ 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. Just like java. But you have to think about pointers.
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. No garbage collection.
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; }; Ask about virtual. (what’s wrong here…)
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); Using p to “point” at the method.
Stack vs. Heap On the Heap / drawStuff() { Ponto *p = new Ponto(); Dynamic allocation On the Stack / Automatic allocation drawStuff() { Ponto *p = new Ponto(); p->move(10,10); //... } Ponto p(); p.move(5,5); On the left we have a pointer that we must dereference. Still must delete p on the left – problem. on the right, everything is ok.
Resumo do Header File Reta.H header file Início do header guard #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 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
Como funciona a herança? Reta cor : int espessura : int desenha RetaPontilhada RetaTracejada espaço : int espaço : int tipoTraço : int desenha desenha
Como funciona a herança? RetaPontilhada herda propriedades de Reta (cor, espessura e pontos) Precisa incluir o header da classe pai aqui #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