33
Pearson Education Slide 1

Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Embed Size (px)

Citation preview

Page 1: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 1

Page 2: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 2

Capítulo 16

Criado por Frederick H. Colclough, Colorado Technical University

Templates(Gabaritos)

Page 3: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 3

Objetivos de Estudo Templates de Função

Sintaxe e definição Compiladores Complicadores

Templates de Classe Sintaxe Exemplo: classe template vetor

Templates e herança Exemplo: classe template de vetores

parcialmente preenchidos

Page 4: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 4

Introdução Templates em C++ Permitem definições para funções e

classesmuito mais ‘gerais’

Nomes de tipos são ‘parâmetros’ em vez detipos atuais

Definição precisa determinada em tempo deexecução

Page 5: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 5

Templates de Função Lembre-se da função trocaValores:

void trocaValores(int& variavel1, int& variavel2){

int temp;

temp = variavel1;variavel1 = variavel2;variavel2 = temp;

} Se aplica apenas à variáveis de tipo int Mas o código trabalharia para quaisquer tipos!

Page 6: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 6

Templates de Função vs. SobrecargaPoderíamos sobrecarregar a função para tipos chars:

void trocaValores(char& variavel1, char& variavel2){char temp;temp = variavel1;variavel1 = variavel2;variavel2 = temp;}

Mas observe: o código é quase idêntico! A única diferença é o tipo usado em 3 lugares

Page 7: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 7

Sintaxe Para Template de Função Permite ‘trocar valores’ de quaisquer tipos de variáveis:

template<class T>void trocaValores(T& variável1, T& variável2){

double temp;temp = variável1;variável1 = variável2;variável2 = temp;

} A primeira linha é chamada de ‘prefixo de template’

Diz ao compilador que está vindo um ‘template’ E que T é um parâmetro tipo

Page 8: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 8

Prefixo de Template Lembre-se:

template<class T> Nesse contexto, ‘class’ significa ‘tipo’ Pode ser confundida com outros contextos

‘conhecidos’ da palavra ‘class’!

C++ permite a palavra-chave ‘typename’ no lugar dapalavra-chave ‘class’

Mas a maioria utiliza ‘class’

Page 9: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 9

Prefixo de Template 2 Novamente:

template<class T> T pode ser substituído por qualquer tipo

Predefinido ou Definido pelo Usuário (como um tipo classe em C++)

No corpo da definição da função : T é usado como qualquer outro tipo

Observe: Pode-se usar outra letra diferente de ‘T’, mas T é de uso ‘tradicional’

Page 10: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 10

Definição de Templates de Função O Template de Função trocaValores() é

atualmente uma grande ‘coleção’ definições!

Uma definição para cada tipo possível! O compilador somente gera definições

quando solicitado Mas é ‘como se’ você tivesse definido para

todos os tipos Escreva uma definição que trabalha para

todos os tipos que precisarem

Page 11: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 11

Chamando um Template de Função Considere a seguinte chamada:

trocaValores(inteiro1, inteiro2); O compilador C++ ‘gera’ uma definição de

função para os dois parâmetros int usando o template

Da mesma forma para todos os tipos Não é preciso fazer nada de ‘especial’ na

chamada A definição requerida é automaticamente

gerada

Page 12: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 12

Outro Template de Função Declaração/protótipo:

Template<class T>void mostraCoisas(int coisa1, T coisa2, T coisa3);

Definição:template<class T>void mostraCoisas(int coisa1, T coisa2, T coisa3){

cout << coisa1 << endl<< coisa2 << endl<< coisa3 << endl;

}

Page 13: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 13

Chamada à mostraCoisas Considere a chamada de função:

mostraCoisas (2, 3.3, 4.4); O compilador gera a definição de função

Substitui T com um tipo double Desde que o segundo parâmetro seja um tipo double

Saída:23.34.4

Page 14: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 14

Compiladores Complicadores Declarações e Definições de funções

Tipicamente nós as temos separadas Para templates não suportado pela maioria

dos compiladores! É mais seguro colocar a definição do template

no mesmo arquivo em que é usada Muitos compiladores exigem que ela apareça em 1o #incluir o arquivo com todas as definições de

template no arquivo de aplicação

Page 15: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 15

Mais sobre Compiladores Complicadores Verifique as exigências específicas

do seu compilador Alguns precisam de opções especiais configuradas Alguns exigem uma ordem especial de arranjo

de definições de templates vs. outros itens no arquivo O esquema de programa de template mais usado:

Definição do template no mesmo arquivo emque é usada

Garanta que a definição do template venhaantes de qualquer uso

Page 16: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 16

Múltiplos Parâmetros Tipo Pode-se ter:

template<class T1, class T2> Não é comum

Geralmente somente um tipo ‘substituível’ énecessário

Não se pode ter parâmetros de templatenão-utilizados

Cada parâmetro deve se ‘usado’ na definição De outro modo, erro!

Page 17: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 17

Abstração Algorítmica Refere-se à implementação de templates Expressar o algorítmo de modo ‘geral’:

Algorítimo se aplica a variáveis de qualquer tipo

Ignore detalhes sem importância Concentre-se nas partes essenciais do

algorítmo Templates de função suportam

abstraçãoalgorítmica

Page 18: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 18

Definindo Estratégias de Templates Desenvolva a função normalmente

Usando os tipos atuais Depure completamente a função ‘ordinária’ Então converta-a para um Template:

Substitua nomes de tipos por parâmetro tipo conforme for necessário

Vantagens: Fácil de resolver: caso ‘concreto’ Trabalho com o algorítmo e não com a

sintaxe do template

Page 19: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 19

Template com um Tipo Inadequado Pose-se usar qualquer tipo em um template

para o qual o código faça ‘sentido’ O código deve-se comportar de forma adequada

ex.: Template de função trocaValores() Não se pode usar um tipo para o qual o operador

de atribuição não está definido Exemplo: Um vetor:

int a[10], b[10];trocaValores(a, b);

A atribuição não funciona com tipos vetor!

Page 20: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 20

Templates de Classe Pode-se também ‘generalizar’ templates

de classe template<class T>

Pode-se aplicar à definição de classe Todas as instâncias de ‘T’ na definição de

classe são substituídas pelo parâmetro tipo Exatamente como em templates de função!

Uma vez definido o template, pode-sedeclarar objetos dessa classe

Page 21: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 21

Definição de Template de Classe template<class T> class Pair{public:

Pair( );Pair(T firstValue,T secondValue);void setFirst(T newValue);void setSecond(T newValue);TgetFirst( ) const;TgetSecond( ) const;

private:Tfirst;Tsecond;

};

Page 22: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 22

Membros para o Template de Classe Par template<class T>

Pair<T>::Pair(T firstVal, T secondVal){

first = firstVal;second = secondVal;

}template<class T>void Pair<T>::setFirst(T newVal){

first = newVal;}

Page 23: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 23

Template de Classe Par Objetos da classe têm ‘pares’ de valores

de tipo T Pode-se então declarar os objetos:

Pair<int> pontos;Pair<char> lugares;

Objetos são usados como quaisquer outros objetos Exemplo:

pontos.setPrimeiro(3);pontos.setSegundo(0);

Page 24: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 24

Definição de Funções-membros de Par Observe as definições de funções-

membros : Cada definição é, ela própria, um ‘template’ Requerem um prefixo de template antes de

cada definição Nome da classe antes de :: é ‘Par<T>’

e não somente ‘Par’ Mas o nome do construtor é apenas ‘Par’ O nome do destrutor também é somente

‘~Par’

Page 25: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 25

Templates de Classe como Parâmetros Considere:

int soma(const Par<int>& oPar); O tipo (int) fornecido para ser usado por T

na definição desta classe Chamada-por-referência ‘acontecendo’ aqui

Novamente: tipos template podem ser usadosem qualquer lugar que tipos-padrão podem

Page 26: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 26

Templates de Classe dentro de Templates de Função

Em lugar de definir nova sobrecarga:template<class T> int soma(const Par<int>& oPar);

//Pré-condição: O operador + é definido para valores de tipo T

//Retorna a soma de dois valores em oPar A função agora se aplica a todos os tipos

de números

Page 27: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 27

Restrições sobre o Parâmetro Tipo Somente tipos ‘razoáveis’ podem ser substituídos Considere:

O operador de atribuição deve ser‘bem comportado’

O construtor de cópia também deve funcionar Se T envolve ponteiros, então o destrutor deve

ser adequado! Assuntos parecidos com Templates de Função

Page 28: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 28

Definições de Tipo Pode-se definir um nome de tipo de nova classe

para representar um nome de template de classeespecializado

Exemplo:typedef Par<int> ParDeInt;

O nome ‘ParDeInt’ agora é usado para Declarar objetos do tipo Par<int>:

ParDeInt par1, par2; O nome também pode ser usado com um

parâmetro ou em qualquer lugar em que um nome de tipo é permitido

Page 29: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 29

Amigos e Templates Funções amigas podem ser usadas com

classes templates Da mesma forma que com classes ordinárias A única diferença é que é preciso incluir um

parâmetro tipo em local apropriado. É muito comum ter amigos de classes template

Especialmente para operadores sobrecarregados(com já vimos)

Page 30: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 30

Classes Template Predefinidas Lembre-se da classe vetor

É uma classe template! Outra: Classe template basic_string

Lida com strings de elementos de‘qualquer tipo’

ex.:basic_string<char> trabalha para caracteresbasic_string<double> trabalha para tipos doublebasic_string<SuaClasse> trabalha para objetos de SuaClasse

Page 31: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 31

Classe Template basic_string Já usada! Lembre-se de ‘string’

É um outro nome para basic_string<char> Todas as funções-membros comportam-se

igualmente para basic_string<T> basic_string está definida na bibliotecas

<string> A definição está no std namespace

Page 32: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 32

Templates e Herança Nenhuma novidade aqui Classes Template derivadas

Pode-se derivar de classes template ounão-template

A classe derivadá é naturalmente umaclasse template

A mesma sintaxe de classe derivadaordinária de uma classe-base ordinária

Page 33: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)

Pearson Education Slide 33

Sumário Templates de Função

Definir funções que tenham um parâmetro para um tipo Templates de classe

Define uma classe com um parâmetro tipo parasubpartes da classe

As classes predefinidas vector e basic_stringsão na realidade classes template

Pode-se definir uma classe template que sejauma classe derivada de uma classe-basetemplate