Curso de Extensão: Linguagem de Programação C++ (Básico)
Faculdade de Informática, PUCRS, Porto Alegre, RS
Coordenação: Isabel Harb Manssour
Instrutores: Eduardo Bezerra e Cristiane Woszezenki
Conversão Dinâmica de Tipos
A conversão dinâmica de tipos é implementada em C++ por intermédio de templates. Template é um modelo a ser seguido por uma classe ou função. Um modelo de classe define o layout e as operações para um conjunto ilimitado de tipos relacionados. Por exemplo, um único modelo de classe List poderia fornecer uma definição comum para listas de “int”, “float” e ponteiros para um objeto qualquer. Um modelo de função define um conjunto ilimitado de funções relacionadas. Por exemplo, um único modelo de função “sort()” poderia fornecer uma definição comum para a classificação de todos os tipos definidos pelo modelo de classe List.
No exemplo a seguir, é utilizado o conceito de Template em uma função. Nesse caso a função menor recebe dois parâmetros do tipo a ser alterado dinâmicamente. O tipo do valor de retorno também é definido dinâmicamente. Para isso é utilizada a palavra reservada do C++ template na estrutura: “template <class T>”. Todas as ocorrências de T na função que inicia logo a seguir a defnição “template <class T>” serão alteradas dinâmicamente de acordo com o solicitado pelas funções que a utilizarem. Por exemplo, no primeiro cout os dois parâmetros x e y da função menor serão do tipo char. No segundo cout esses mesmos parâmetros serão do tipo int.
#include <iostream> using namespace std; template <class T> T menor(T x, T y) { return (x < y) ? x : y; } int main() { char c = 'z', d = 'a'; cout << endl << menor(c, d) << endl; int n = 5, m = 6; cout << endl << menor(n, m) << endl; return 0; }
O próximo exemplo (função swap_edu) a idéia é semelhante ao exemplo anterior, porém os parâmetros são passados por referência.
#include <iostream> using namespace std; template <class T> void swap_edu(T &x, T &y) { T h = x; x = y; y = h; } int main() { char c = 'z', d = 'a'; cout << "CHAR" << endl << "----" << endl; cout << "B4 c = " << c << ", d = " << d << endl; swap_edu(c, d); cout << "After c = " << c << ", d = " << d << endl << endl; int n = 5, m = 6; cout << "INT" << endl << "---" << endl; cout << "B4 n = " << n << ", m = " << m << endl; swap_edu(n, m); cout << "After n = " << n << ", m = " << m << endl; return 0; }
O próximo exemplo mostra o uso de conversão dinâmica de tipos em classes. De forma semelhante ao que ocorre em funções, com classes também é necessário utilizar a palavra reservada do C++ template na forma: “template <class T>”. Todas as ocorrências de T na classe que inicia logo a seguir a defnição “template <class T>” serão alteradas dinâmicamente de acordo com o solicitado. Notar a importância e flexibilidade introduzida pelo uso de templates nesse exemplo. Na função main ao serem criadas instâncias da classe Array, uma delas (ia) será um array de inteiros, e a outra um array de floats. O uso de templates possibilita a utilização da mema classe Array com diversos tipos diferentes.
#include <iostream> using namespace std; template<class T> class Array { enum { size = 100 }; T A[size]; public: T& operator[](int index); }; template<class T> T& Array<T>::operator[](int index) { if (index < 0 || index >= size) { cout << "Index out of range! Assuming 0." << endl; index = 0; } return A[index]; } int main() { Array<int> ia; Array<float> fa; for(int jos = 0; jos < 20; jos++) { ia[jos] = jos * jos; fa[jos] = float(jos) * 1.414; } for(int j = 0; j < 20; j++) cout << j << ": " << ia[j] << ", " << fa[j] << endl; return 0; }