pearson education slide 1. pearson education slide 2 cap í tulo 16 criado por frederick h....
TRANSCRIPT
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
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
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!
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
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
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’
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’
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
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
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;
}
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
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
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
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!
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
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
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!
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
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;
};
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;}
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);
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’
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
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
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
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
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)
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
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
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
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