Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouVera Bayer Oliveira Alterado mais de 9 anos atrás
1
Pearson Education Slide 1
2
Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)
3
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
4
Pearson Education Slide 4 Introdução Templates em C++ Permitem definições para funções e classes muito mais ‘gerais’ Nomes de tipos são ‘parâmetros’ em vez de tipos atuais Definição precisa determinada em tempo de execução
5
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!
6
Pearson Education Slide 6 Templates de Função vs. Sobrecarga Poderí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
7
Pearson Education Slide 7 Sintaxe Para Template de Função Permite ‘trocar valores’ de quaisquer tipos de variáveis: template 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
8
Pearson Education Slide 8 Prefixo de Template Lembre-se: template Nesse contexto, ‘class’ significa ‘tipo’ Pode ser confundida com outros contextos ‘conhecidos’ da palavra ‘class’! C++ permite a palavra-chave ‘typename’ no lugar da palavra-chave ‘class’ Mas a maioria utiliza ‘class’
9
Pearson Education Slide 9 Prefixo de Template 2 Novamente: template 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’
10
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
11
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
12
Pearson Education Slide 12 Outro Template de Função Declaração/protótipo: Template void mostraCoisas(int coisa1, T coisa2, T coisa3); Definição: template void mostraCoisas(int coisa1, T coisa2, T coisa3) { cout << coisa1 << endl << coisa2 << endl << coisa3 << endl; }
13
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: 2 3.3 4.4
14
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 1 o #incluir o arquivo com todas as definições de template no arquivo de aplicação
15
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 em que é usada Garanta que a definição do template venha antes de qualquer uso
16
Pearson Education Slide 16 Múltiplos Parâmetros Tipo Pode-se ter: template Não é comum Geralmente somente um tipo ‘substituível’ é necessário Não se pode ter parâmetros de template não-utilizados Cada parâmetro deve se ‘usado’ na definição De outro modo, erro!
17
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ção algorítmica
18
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
19
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!
20
Pearson Education Slide 20 Templates de Classe Pode-se também ‘generalizar’ templates de classe template 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-se declarar objetos dessa classe
21
Pearson Education Slide 21 Definição de Template de Classe template class Pair { public: Pair( ); Pair(T firstValue,T secondValue); void setFirst(T newValue); void setSecond(T newValue); TgetFirst( ) const; TgetSecond( ) const; private: Tfirst; Tsecond; };
22
Pearson Education Slide 22 Membros para o Template de Classe Par template Pair ::Pair(T firstVal, T secondVal) { first = firstVal; second = secondVal; } template void Pair ::setFirst(T newVal) { first = newVal; }
23
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 pontos; Pair lugares; Objetos são usados como quaisquer outros objetos Exemplo: pontos.setPrimeiro(3); pontos.setSegundo(0);
24
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 ’ e não somente ‘Par’ Mas o nome do construtor é apenas ‘Par’ O nome do destrutor também é somente ‘~Par’
25
Pearson Education Slide 25 Templates de Classe como Parâmetros Considere: int soma(const Par & 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 usados em qualquer lugar que tipos-padrão podem
26
Pearson Education Slide 26 Templates de Classe dentro de Templates de Função Em lugar de definir nova sobrecarga: template int soma(const Par & 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
27
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
28
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 classe especializado Exemplo : typedef Par ParDeInt; O nome ‘ParDeInt’ agora é usado para Declarar objetos do tipo Par : 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
29
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)
30
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 trabalha para caracteres basic_string trabalha para tipos double basic_string trabalha para objetos de SuaClasse
31
Pearson Education Slide 31 Classe Template basic_string Já usada! Lembre-se de ‘string’ É um outro nome para basic_string Todas as funções-membros comportam-se igualmente para basic_string basic_string está definida na bibliotecas A definição está no std namespace
32
Pearson Education Slide 32 Templates e Herança Nenhuma novidade aqui Classes Template derivadas Pode-se derivar de classes template ou não-template A classe derivadá é naturalmente uma classe template A mesma sintaxe de classe derivada ordinária de uma classe-base ordinária
33
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 para subpartes da classe As classes predefinidas vector e basic_string são na realidade classes template Pode-se definir uma classe template que seja uma classe derivada de uma classe-base template
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.