26
+ Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/

+ Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

Embed Size (px)

Citation preview

Page 1: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+

Curso de C/C++

Aula 8

Instrutor: Luiz Felipe Sotero

Material por: Allan Lima

http://allanlima.wordpress.com/

Page 2: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra

Sob as seguintes condições: Atribuição. Você deve dar crédito ao autor original, da forma

especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença. Se você alterar, transformar, ou

criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.

Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra.

Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor.

Veja aqui a licença completa

Page 3: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Roteiro

Métodos virtuais

Classes abstratas

Templates

Page 4: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Métodos Virtuais

Problema:

Método area()Queremos que as classes Retangulo e Triangulo

tenham métodos com implementações diferentes

Poligono

Retangulo Triangulo

Page 5: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Métodos Virtuais

Solução:

Declarar o método area() virtual virtual int area(); O modificador virtual permite que um ponteiro para

uma classe básica possa chamar o método correto Exemplo: Triangulo t(45, 10);

Poligono *pp = &t;

cout << "Area de pp: "

<< pp->area()

<< endl;

Page 6: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploMetodosVirtuais.cpp

Page 7: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classes Abstratas

São classe que não podem ter objetos instanciados

Uma classe é dita abstrata quando possui pelo menos um método abstrato

Um método abstrato é aquele que não é implementado na classe

Usamos “= 0” após o protótipo do método para torná-lo abstrato

Exemplo: virtual int area() = 0;

Page 8: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classes Abstratas

Toda classe que herda de uma classe abstrata deve implementar os métodos abstratos

Exceção: Quando a sub-classe também é abstrata

Métodos abstratos podem ser utilizados normalmente em classes abstratas

Page 9: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classes Abstratas

exemploClassesAbstratas.cpp

Page 10: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exercícios

1)Crie uma classe abstrata ElementoGeometrico com os seguintes métodos públicos virtuais:

virtual float perimetro() = 0;virtual float area() = 0; Crie as classes Circulo e Quadrado que herdam de

ElementoGeometrico e implementam os seus métodos Sinta-se a vontade para definir os atributos e

construtores necessários para cada classe

Page 11: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Templates

São mecanismos que permitem a definição genérica de funções e classes sem especificar os tipos de implementação

Ajudam a reutilizar o código

São muito bons para a construção de bibliotecas

Page 12: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Templates de Funções

Definem um algoritmo genérico e independente de tipo

Exemplo:

Busca em um arrayMaximo entre elementosOrdenação de um arrayMínimo entre elementos

Page 13: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Templates de Funções

Permitem a criação de funções genéricas

Recebendo qualquer tipo de dado como parâmetro Retornando qualquer tipo de dado

Uma única função criada pode ser aplicada a qualquer tipo

Sintaxe: template <class identificador> função; template <tipo identificador> função;

Page 14: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

template<class T>

T maximo(T a, T b) {

return (a > b) ? a : b;

}

int a = maximo(10, 45) ;double d = maximo(10.5, 5.06);// como a e b devem ter o mesmo tipo utilizamos <double>double c = maximo <double> (5, 5.06);

Page 15: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploTemplatesFuncoes.cpp

Page 16: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Templates de Classes

Problema:

Queremos criar uma classe Stack que pode ser de inteiros, floats, strings, ..., ou qualquer outro tipo definido pelo programador

Queremos criar uma classe Stack genérica Solução:

Utilizar templates de classes template <class T>

class Stack { ... };

Page 17: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploTemplatesClasses.cpp

Page 18: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Especialização de Templates

Muitas vezes o comportamento genérico não é capaz resolver todos os problemas

Exemplo:Stack<char *> sChar(10);

E se liberarem a memória da string? Este objeto não cria cópias das strings, faz apenas

cada elemento seu apontar para o mesmo endereço da string que foi passada como parâmetro

Solução: Especialização de Templates

Page 19: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo// não precisamos mais do template <class T>

void Stack<char*>::push(char* &element) {

if (this->nextIndex != -1) {

this->elements[this->nextIndex] =

new char[strlen(element) + 1];

strcpy(this->elements[this->nextIndex],

element);

this->nextIndex--;

}

}

Page 20: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Especialização de Templates

Também podemos especializar um Template de Classe ou uma função qualquer

Assim garantimos o comportamento correto para tipos específicos

Page 21: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploEspecializacaoTemplates.cpp

Page 22: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Especialização de Templates

Podemos especializar Templates de classes

É útil quando os comportamentos são muito diferentes

Estas classes devem redefinir todos os membros para o tipo específico

Também podemos criar novos membros

Sintaxe:

template <>

class nomedaClasse <Tipo> { ... };

Page 23: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploEspecializacaoClasses.cpp

Page 24: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exercícios

2)Crie um template chamado Vetor

Esta classe irá guardar um array de elementos genéricos

Os seus métodos são: void inserir(T &elemento); int procurarIndice(T &elemento); bool contem(T &elemento); void remover(T &elemento);

Desafios: Faça a sua classe funcionar corretamente com char * Implemente o operador []

Page 25: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Referências

Stroustrup, Bjarne. The C++ Programming Language, Special Edition

Eckel, Bruce. Thinking in C++, 2nd ed. Volume 1

Slides de Gustavo ([email protected]) do curso de C/C++

Page 26: + Curso de C/C++ Aula 8 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Agradecimentos

Allan Lima, Breno do Vale e Francisco Magalhães

Pelo material cedido para o curso