INSTRUTOR SCOPINO AULAS UMEC 2005 INSTRUTOR: SCOPINO AULA 9.
+ Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima
Transcript of + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima
![Page 1: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/1.jpg)
+
Curso de C/C++
Aula 8
Instrutor: Francisco Magalhães
Material por: Allan Lima
http://allanlima.wordpress.com/
![Page 2: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/2.jpg)
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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/3.jpg)
+Roteiro
Métodos virtuais
Classes abstratas
Templates
![Page 4: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/4.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/5.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/6.jpg)
+Exemplo
exemploMetodosVirtuais.cpp
![Page 7: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/7.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/8.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/9.jpg)
+Classes Abstratas
exemploClassesAbstratas.cpp
![Page 10: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/10.jpg)
+Execercí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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/11.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/12.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/13.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/14.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/15.jpg)
+Exemplo
exemploTemplatesFuncoes.cpp
![Page 16: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/16.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/17.jpg)
+Exemplo
exemploTemplatesClasses.cpp
![Page 18: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/18.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/19.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/20.jpg)
+Especialização de Templates
Também podemos especializar um Template de Classe ou uma função qualquer
Assim garantimos o comportamento correto para tipo
![Page 21: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/21.jpg)
+Exemplo
exemploEspecializacaoTemplates.cpp
![Page 22: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/22.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/23.jpg)
+Exemplo
exemploEspecializacaoClasses.cpp
![Page 24: + Curso de C/C++ Aula 8 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/24.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/25.jpg)
+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: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022070311/552fc142497959413d8df7ba/html5/thumbnails/26.jpg)
+Agradecimentos
Allan Lima e Breno do Vale
Pelo material cedido para o curso