A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 16 Criado por Frederick H. Colclough, Colorado Technical University Templates (Gabaritos)"— Transcrição da apresentação:

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


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

Apresentações semelhantes


Anúncios Google