Laboratório de programação II

Documentos relacionados
Linguagens de Programação

Templates. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP

Programação Orientada a Objetos para Redes de Computadores

Laboratório de programação II

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

Programação Orientada a Objetos OUTROS MECANISMOS

Genéricos by Pearson Education do Brasil

PCC104 - Projeto e Análise de Algoritmos

//conteúdo do arquivo pacote.h

Genéricos. Profa. Thienne Johnson EACH/USP

Programação Orientada a Objetos

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

PCS Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 5: Encapsulamento e Tipo Abstrato de Dados

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 6: Polimorfismo

Pilhas. Profa Morganna Diniz

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Fundamentos de Programação

Um aluno digitou o código C++ a seguir:

Fundamentos de Programação 2

Programação científica C++

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Linguagem de Programação C++

Técnicas de Programação:

Tipos abstrados de dados e construções de encapsulamento

Linguagem de Programação C++

U.C. (21093) Programação por Objetos. XX de Julho de INSTRUÇÕES --

PCS Laboratório de Programação Orientada a Objetos 1a. Prova. 02 de Setembro de 2015

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Templates. Templates em C++ é o mecanismo que permite que um tipo seja parâmetro de uma classe ou função

O container vector funciona como um vetor comum, ou seja, os blocos de objetos estão contíguos, permitindo acesso aleatório.

Linguagens de Programação Departamento de Engenharia Eletrônica e de Computação - DEL-Poli/UFRJ Prof.: Miguel Elias Mitre Campista

Orientação a Objetos. Programação em C++

C com introdução a OO

Sobrecarga de Operadores

Generics POO. Prof. Marcio Delamaro

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Coleção de Dados. Coleções de Dados Classificação 4/1/2011

Aula 26: Estruturas heterogêneas

Standard Template Library (STL)

ESTRUTURAS DE DADOS E ALGORITMOS II ANTONIO RAMOS DE CARVALHO JÚNIOR PILHAS

CPP. C plus plus versus Java

Exercícios... Capítulo 15. if62c. prof. Robinson Vida Noronha. Monday, March 23, 15

Física Computacional 15 Templates

Classes e Encapsulamento

Exercício de Estrutura de dados. Java Fila

Linguagem de Programação I

Computação e Programação Exame Época de recurso

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Programação Orientada a Objetos

Programação Orientada a Objetos Aula I Declaração de classes, métodos construtores. Prof.: Bruno E. G. Gomes IFRN

Linguagem de Programação I

Linguagem de Programação I

Linguagem Algorítmica OO. Linguagem Algorítmica

Namespaces, Classes e Métodos.

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETRÔNICA (DAELN) 2 a Prova

Algoritmos e Estruturas de Dados 2005/2006

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 10: Exercício Integrador (parte 1)

Linguagem de Programação III

Algoritmos e Estruturas de Dados

Linguagem de Programação C++

Física Computacional

Programação Orientada a Objetos HERANÇA E COMPOSIÇÃO

Estrutura de dados 1. Ponteiros

Introdução à linguagem C++

Carlos Eduardo Batista. Centro de Informática - UFPB

Orientação a Objetos AULA 09

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira

Carlos Eduardo Batista. Centro de Informática - UFPB

Computação e Programação (2007/2008-1º Semestre)

Introdução ao C++ Ambientes de Desenvolvimento Avançados. 2 de Outubro de 2002 ADA / DEI - ISEP 2002/2003 1

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Herança. BCC702-Programação de Computadores II Emiliana Mara Lopes Simões Universidade Federal de Ouro Preto abril 2010

Pedro Vasconcelos DCC/FCUP. Programação Funcional 17 a Aula Tipos abstratos

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

Programação Funcional 13 a Aula Tipos abstratos

programas = estrutura de dados + algoritmos

Programação Orientada a Objetos CLASSES E OBJETOS

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

Universidade Federal de Uberlândia Faculdade de Computação

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Generics - Java. Fernando Santos. Programação Orientada a Objetos

Aula 27: Estruturas heterogêneas e alocação dinâmica

Fundamentos de Programação

Parte IV. Linguagens de Programação. Relembrando da Última Aula... Empacotador de Préprocessadores. Primeiro Exemplo Usando Classes em C++

Linguagens de Programação

Classes, Métodos e Propriedades

ESTRUTURA COM DECISÃO COMPOSTA

Overloading de Operadores

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Análise de Programação

Herança em C++ Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2006/2007) Herança

Fundamentos de Programação

Introdução e Conceitos

DEM-Sec.Sistemas Tipos Abstractos de Informação 2006 / Programação

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Física Computacional 7 Classes

Overloading de Operadores

C++ - Funções Virtuais (Polimorfismo) Base. Deriv0 Deriv1 Deriv2. print( ) print( ) print( ) dv0 dv1 dv2. p[0] = &dv0; p[1] = &dv1; p[2] = &dv2;

Transcrição:

Laboratório de programação II Templates Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno

Introdução Templates são uma alternativa à sobrecarga de funções, quando estas envolvem lógicas de programas e operações idênticas para vários tipos de dados. O uso de templates permite ao programador a implementação de um único código para uma determinada função. C++ gera automaticamente funções template para tratar as chamadas. Para definir um template de função, basta usar a palavra-chave template seguida da lista de parâmetros entre os símbolos < e >. Parâmetros devem ser precedidos da palavra-chave typename ou class

Função template template <typename tipogenerico> // ou template <class tipogenerico> tipogenerico minhafuncao(tipogenerico valor1, tipogenerico valor2) { // código da função int main() { // meu código

Classe template Templates também pode ser usados para criar classes genéricas. Todos métodos devem ser implementados no arquivo de cabeçalho o compilador gera automaticamente o código quando a palavra-chave template é encontrada /***** minhaclasse.h *****/ template <class Alpha> class minhaclasse { public: minhaclasse(); void meumetodo(alpha var); private: Alpha _var; ; template <class T> minhaclasse<t>::minhaclasse() { // minha construtora template <class T> minhaclasse<t>::meumetodo(alpha var) { _var = var;

Exemplo de uma Classe Template template<class ItemType> class GList { public: bool IsEmpty() const; bool IsFull() const; int Length() const; void Insert( /* in */ ItemType item ); void Delete( /* in */ ItemType item ); bool IsPresent( /* in */ ItemType item ) const; void SelSort(); void Print() const; GList(); private: int length; ItemType data[max_length]; ; Parâmetro Template // Constructor

Instanciando uma classe template Argumentos da classe template devem ser explícitos. Quando uma classe template é instanciada O compilador substitui o argumento genérico em toda a classe pelo argumento de tipo informado

Instanciando uma Classe Template Para criar uma lista de diferentes tipo // Client code GList<int> list1; GList<float> list2; GList<string> list3; template argument list1.insert(356); list2.insert(84.375); list3.insert("muffler bolt"); O compilador gera 3 tipos de classe distintos GList_int list1; GList_float list2; GList_string list3;

Exemplo de substituição class Glist_int { public: int void Insert( /* in */ ItemType item ); void Delete( /* in */ ItemType item ); int bool IsPresent( /* in */ ItemType item ) const; private: int length; ItemType data[max_length]; ; int int

Definição de função membro de uma classe template template<class ItemType> void GList<ItemType>::Insert( /* in */ ItemType item ) { data[length] = item; length++; //after substitution of float void GList<float>::Insert( /* in */ float item ) { data[length] = item; length++;

Classe Template A definição de classes template vem precedida de um cabeçalho Tal como template< typename T > O parâmetro T pode ser usado como um tipo de dado em uma método ou atributo Outros parâmetros podem ser especificados usando vírgula para separá-los template< typename T1, typename T2 >

1 // Stack.h 2 // Stack class template. 3 #ifndef STACK_H 4 #define STACK_H 5 6 template< typename T > 7 class Stack 8 { 9 public: 10 Stack( int = 10 ); // default constructor (Stack size 10) 11 12 // destructor 13 ~Stack() 14 { 15 delete [] stackptr; // deallocate internal space for Stack 16 // end ~Stack destructor 17 18 bool push( const T& ); // push an element onto the Stack 19 bool pop( T& ); // pop an element off the Stack 20 21 // determine whether Stack is empty 22 bool isempty() const 23 { 24 return top == -1; 25 // end function isempty Define uma classe template Stack com um parâmetro genérico T Example Stack.h Métodos usando o parâmetro genérico T na especificação de seus argumentos

26 27 // determine whether Stack is full 28 bool isfull() const 29 { 30 return top == size - 1; 31 // end function isfull 32 33 private: 34 int size; // # of elements in the Stack 35 int top; // location of the top element (-1 means empty) 36 T *stackptr; // pointer to internal representation of the Stack 37 ; // end class template Stack 38 39 // constructor template 40 template< typename T > 41 Stack< T >::Stack( int s ) 42 : size( s > 0? s : 10 ), // validate size 43 top( -1 ), // Stack initially empty 44 stackptr( new T[ size ] ) // allocate memory for elements 45 { 46 // empty body 47 // end Stack constructor template atributo stackptr é um ponteiro para um tipo T Example Stack.h Método implementado fora da classe template inicia com o cabeçalho template equivalente ao da classe

48 49 // push element onto Stack; 50 // if successful, return true; otherwise, return false 51 template< typename T > 52 bool Stack< T >::push( const T &pushvalue ) 53 { 54 if (!isfull() ) 55 { 56 stackptr[ ++top ] = pushvalue; // place item on Stack 57 return true; // push successful 58 // end if 59 60 return false; // push unsuccessful 61 // end function template push 62 63 // pop element off Stack; 64 // if successful, return true; otherwise, return false 65 template< typename T > 66 bool Stack< T >::pop( T &popvalue ) 67 { 68 if (!isempty() ) 69 { 70 popvalue = stackptr[ top-- ]; // remove item from Stack 71 return true; // pop successful 72 // end if 73 74 return false; // pop unsuccessful 75 // end function template pop 76 77 #endif Example Stack.h

1 // main.cpp 2 // Stack class template test program. 3 #include <iostream> 4 5 using namespace std; 6 7 #include "Stack.h" // Stack class template definition 8 9 int main() 10 { 11 Stack< double > doublestack( 5 ); // size 5 12 double doublevalue = 1.1; 13 14 cout << "Pushing elements onto doublestack\n"; 15 16 // push 5 doubles onto doublestack 17 while ( doublestack.push( doublevalue ) ) 18 { 19 cout << doublevalue << ' '; 20 doublevalue += 1.1; 21 // end while 22 23 cout << "\nstack is full. Cannot push " << doublevalue 24 << "\n\npopping elements from doublestack\n"; 25 26 // pop elements from doublestack 27 while ( doublestack.pop( doublevalue ) ) 28 cout << doublevalue << ' '; Example main.cpp Main cria uma especialização da classe template Stack< double > onde o tipo double é associado ao parâmetro T

29 30 cout << "\nstack is empty. Cannot pop\n"; 31 32 Stack< int > intstack; // default size 10 33 int intvalue = 1; 34 cout << "\npushing elements onto intstack\n"; 35 36 // push 10 integers onto intstack 37 while ( intstack.push( intvalue ) ) 38 { 39 cout << intvalue << ' '; 40 intvalue++; 41 // end while 42 43 cout << "\nstack is full. Cannot push " << intvalue 44 << "\n\npopping elements from intstack\n"; 45 46 // pop elements from intstack 47 while ( intstack.pop( intvalue ) ) 48 cout << intvalue << ' '; 49 50 cout << "\nstack is empty. Cannot pop" << endl; 51 return 0; 52 // end main Mesma main cria uma nova especialização da classe template Stack< int > onde int é associado ao parâmetro genérico T Example main.cpp

Classe Template e Parâmetros sem Tipo Classe templates Parâmetros sem tipo Argumentos padrão Tratados como consts Ex.: template< class T, int elements > Stack< double, 100 > mostrecentsalesfigures; Declara objeto do tipo Stack< double, 100> pilha

Classe Template e Parâmetros sem Tipo

Classe Template e Parâmetros sem Tipo Classe templates Parâmetro tipados Tipo padrão Ex.: template< class T = string > Declara objeto do tipo Stack<> pilha; Linguagens de Programação DEL-Poli/UFRJ Prof. Miguel Campista

Classe Template e Herança Os conceitos associados à herança podem ser utilizados em classes template Além de gerar classes, podemos gerar hierarquias de classes com templates. Cada hieraquia é parametrizada. Funções virtuais são permitidas na hierarquia, ou seja podemos ter polimorfismo. Pode-se ter também classes template abstratas, etc... Linguagens de Programação DEL-Poli/UFRJ Prof. Miguel Campista

Classe template e herança #include <iostream> template <class T > class Base{ T tob; public: Base(T par=0): tob(par) { virtual void fpoli( ) { cout << "\n base " << tob; ; template <class T> class Deriv : public Base { T tod; public: Deriv(T parb=0, T pard=0) : Base(parb), tod(pard) { void fpoli() { cout << "\n deriv " << tod; ; template <class T> void f(base<t>* ptb) { ptb->fpoli(); int main() { Deriv<int> i0; i0.fpoli(); Base<int> i1(1); i1.fpoli(); Base<float> *ptbf = new Base(10.); ptbf->fpoli(); f(ptbf); delete ptbf; ptbf = new Deriv<float>(20.,30.); ptbf->fpoli(); f(ptbf); delete ptbf; return 0;

Exercícios A função abaixo só ordena arranjos de elementos do tipo int. Escreva a função genérica correspondente: void ordenaporselecao(int a[], int N){ int i,j,aux,indmenor; for(i=0; i<n-1; i++){ indmenor=i; for(j=i+1; j<n; j++) if(a[j]<a[indmenor]) indmenor=j; aux=a[i]; a[i]=a[indmenor]; a[indmenor]=aux; Escreva um programa que utiliza a função genérica da questão anterior.