Baixe o app para aproveitar ainda mais
Prévia do material em texto
Templates BCC702-Programação de Computadores II Emiliana Mara Lopes Simões simoes.eml@gmail.com Universidade Federal de Ouro Preto maio 2010 Templates PROBLEMA: Criar uma função que determina o maior de três números inteiros Templates PROBLEMA: Criar uma função que determina o maior de três valores do tipo int int maximo(int a, int b, int c){ int max = a; if(b > max) max = b; if(c > max) max = c; return max; } Templates PROBLEMA: Criar uma função que determina o maior de três valores do tipo double COMO RESOLVER??? Templates PROBLEMA: Criar uma função que determina o maior de três valores do tipo double double maximo(double a, double b, double c){ double max = a; if(b > max) max = b; if(c > max) max = c; return max; } Templates Códigos quase idênticos!!! A única diferença é o tipo usado em 5 lugares. Templates As funções sobrecarregadas normalmente realizam operações semelhantes ou idênticas sobre tipos de dados diferentes Se forem idênticas para cada tipo, as operações podem ser expressas de maneira mais compacta e conveniente utilizando templates de função Templates As funções sobrecarregadas normalmente realizam operações semelhantes ou idênticas sobre tipos de dados diferentes Se forem idênticas para cada tipo, as operações podem ser expressas de maneira mais compacta e conveniente utilizando templates de função Sintaxe Para Template de Função Permite “obter o maior dentre três valores” de quaisquer tipos de variáveis: Sintaxe Para Template de Função Todas as definições de template de função começam com a palavra-chave template seguida por uma lista de parâmetros de template Exemplos: template < class T > template < class T1, class T2 > Sintaxe Para Template de Função Os parâmetros de template são utilizados para especificar: 1 Os tipos dos argumentos para a função 2 O tipo de retorno da função 3 Os tipos de variáveis declaradas dentro da função Sintaxe Para Template de Função Os parâmetros de template são utilizados para especificar: 1 Os tipos dos argumentos para a função 2 O tipo de retorno da função 3 Os tipos de variáveis declaradas dentro da função Sintaxe Para Template de Função Os parâmetros de template são utilizados para especificar: 1 Os tipos dos argumentos para a função 2 O tipo de retorno da função 3 Os tipos de variáveis declaradas dentro da função Sintaxe Para Template de Função Os parâmetros de template são utilizados para especificar: 1 Os tipos dos argumentos para a função 2 O tipo de retorno da função 3 Os tipos de variáveis declaradas dentro da função Definição de Templates de Função O Template de Função maximo(...) é atualmente uma grande coleção de 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 Definição de Templates de Função O Template de Função maximo(...) é atualmente uma grande coleção de 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 Chamando um Template de Função Supondo que o template de função maximo(...) tenha sido definido no mesmo arquivo do main, temos: #include <iostream> using namespace std; ... //definição do template de função maximo(...) main(){ int a = 2, b = 3, c = 5; double x = 6.6, y = 3.4, z = 0.99; cout << “O maior entre tres inteiros: ” << maximo(a, b, c); cout << endl; cout << “O maior entre tres numeros reais: ” << maximo(x, y, z); cout << endl; system(“pause”); } Observações sobre a Sintaxe Para Template template < class T > Nesse contexto, class significa tipo C++ permite a palavra-chave typename no lugar da palavra-chave class Exemplos: template < typename T > template < typename T1, typename T2 > Observações sobre a Sintaxe Para Template template < class T > T pode ser substituído por qualquer tipo predefinido ou definido pelo usuário OBSERVAÇÃO: Pode-se usar outra letra diferente de T, mas T é de uso tradicional Exemplos de Templates de Função Exemplo: Função para impressão de um valor inteiro e outros dois valores do mesmo tipo Definição: template <class T> void mostraCoisas(int coisa1, T coisa2, T coisa3) { cout << coisa1 << endl << coisa2 << endl << coisa3 << endl; } Exemplos de Templates de Função #include <iostream> #include <string> using namespace std; template <class T> void mostraCoisas(int coisa1, T coisa2, T coisa3) { cout << coisa1 << “ ” << coisa2 << “ ” << coisa3 << endl; } main(){ mostraCoisas(1, 10, 20); //inteiros mostraCoisas(2, “Programacao ”, “de Computadores II”); //strings mostraCoisas(3, 9.5, 8.7); //doubles system(“pause”); } Exemplos de Templates de Função O compilador gera definições de função 1 Substituindo T por um tipo int 2 Substituindo T por um tipo string 3 Substituindo T por um tipo double Saída do programa: 1 10 20 2 Programacao de Computadores II 3 9.5 8.7 Exemplos de Templates de Função Pode haver mais de um parâmetro de tipo no template. Exemplo: Função para impressão de dois valores template <class T1, class T2> void mostraCoisas(T1 coisa1, T2 coisa2) { cout << coisa1 << endl << coisa2 << endl; } Cada parâmetro de tipo deve ser usado na definição do template de função. Caso contrário, erro! Vejam que T1 e T2 foram usados na lista de parâmetros da função (OK!) Exemplos de Templates de Função Pode haver mais de um parâmetro de tipo no template. Exemplo: Função para impressão de dois valores template <class T1, class T2> void mostraCoisas(T1 coisa1, T2 coisa2) { cout << coisa1 << endl << coisa2 << endl; } Cada parâmetro de tipo deve ser usado na definição do template de função. Caso contrário, erro! Vejam que T1 e T2 foram usados na lista de parâmetros da função (OK!) Exemplos de Templates de Função Pode haver mais de um parâmetro de tipo no template. Exemplo: Função para impressão de dois valores template <class T1, class T2> void mostraCoisas(T1 coisa1, T2 coisa2) { cout << coisa1 << endl << coisa2 << endl; } Cada parâmetro de tipo deve ser usado na definição do template de função. Caso contrário, erro! Vejam que T1 e T2 foram usados na lista de parâmetros da função (OK!) Exemplos de Templates de Função #include <iostream> #include <string> using namespace std; template <class T1, class T2> void mostraCoisas(T1 coisa1, T2 coisa2) { cout << coisa1 << “ ” << coisa2 << “ ” << endl; } main(){ mostraCoisas(10, 20);//inteiro, inteiro mostraCoisas(4.5, “Programacao de Computadores II”);//double, string mostraCoisas(3, 9.5); //inteiro, double system(“pause”); } Exemplos de Templates de Função O compilador gera definições de função 1 Substituindo T1 por um tipo int e T2 por um tipo int 2 Substituindo T1 por um tipo double e T2 por um tipo string 3 Substituindo T1 por um tipo int e T2 por um tipo double Saída do programa: 10 20 4.5 Programacao de Computadores II 3 9.5 Template com um tipo inadequado ATENÇÃO: Pode-se usar qualquer tipo em um template desde que o código faça sentido Exemplo: O template de função maximo() definido no início da aula Não se pode usar um tipo para o qual os operadores de atribuição e comparação não estão definidos int a[10], b[10], c[10]; maximo(a, b, c); //ERRADO!!! A atribuição e comparação //não funcionam com tipos vetor Templates de Classe Pode-se também generalizar templates de classe Exatamente como em templates de função! Uma vez definido o template, pode-se declarar objetos dessa classe Templates de Classe IMPORTANTE: A maioria dos compiladores C++ requer a exibição da definição completa de um template no arquivo de código-fonte que utiliza o template Por essa razão, os templates são frequentemente definidos em arquivos de cabeçalho (.h), que são então incluídos (com #include) nos arquivos de código-fonte que usam o template Para os templates de classe, isso quer dizer que as funções-membro também são definidas no arquivo de cabeçalho. Tudo é implementadono arquivo .h e não é usado o arquivo .cpp Exemplo de Template de Classe Exemplo: Template de classe que tem um par de valores de tipo T template <class T> class Par{ private: T primeiro; T segundo; public: Par(){ } //função definida dentro da própria definição de classe Par(T v1, T v2); void setPrimeiro(T v); void setSegundo(T v); T getPrimeiro( ); T getSegundo( ); }; ... Par.h Exemplo de Template de Classe ... template <class T> Par< T >::Par(T v1, T v2){ primeiro = v1; segundo = v2; } template <class T> void Par< T >::setPrimeiro(T v){ primeiro = v; } template <class T> void Par< T >::setSegundo(T v){ segundo = v; } ... Par.h Exemplo de Template de Classe ... template <class T> T Par< T >::getPrimeiro(){ return primeiro; } template <class T> T Par< T >::getSegundo(){ return segundo; } Par.h Exemplo de Template de Classe Um template de classe Par torna-se a base para criar muitas classes Par (como Par de double, Par de int, Par de string e etc...) As definições de função-membro que aparecem fora da definição de template de classe iniciam, cada uma, com o cabeçalho template <class T> Para associar cada definição de função-membro ao escopo do template de classe, antes do operador de resolução de escopo (::) usa-se o nome genérico da classe Par < T > Exemplo de Template de Classe Um template de classe Par torna-se a base para criar muitas classes Par (como Par de double, Par de int, Par de string e etc...) As definições de função-membro que aparecem fora da definição de template de classe iniciam, cada uma, com o cabeçalho template <class T> Para associar cada definição de função-membro ao escopo do template de classe, antes do operador de resolução de escopo (::) usa-se o nome genérico da classe Par < T > Exemplo de Template de Classe Um template de classe Par torna-se a base para criar muitas classes Par (como Par de double, Par de int, Par de string e etc...) As definições de função-membro que aparecem fora da definição de template de classe iniciam, cada uma, com o cabeçalho template <class T> Para associar cada definição de função-membro ao escopo do template de classe, antes do operador de resolução de escopo (::) usa-se o nome genérico da classe Par < T > Exemplo de Template de Classe #include <iostream> #include “Par.h” using namespace std; main(){ Par <char> p1(’a’, ’b’); //Objeto declarado como Par de char Par <double> p2(9.6, 2.3); //Objeto declarado como Par de double cout << p1.getPrimeiro() << “ ” << p2.getPrimeiro() << endl << p1.getSegundo() << “ ” << p2.getSegundo() << endl; system(“pause”); } Exemplo de Template de Classe Saída do programa: a 9.6 b 2.3 Resumindo Os templates representam um dos mais poderosos recursos de reutilização de software de C++ Os templates de função/classe permitem aos programadores especificar, com um único segmento de código, uma série de funções/classes relacionadas chamadas especializações de template de função/classe Dúvidas? Próxima Aula Decidir... 17? 24? ou 31?
Compartilhar