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;
}