Curso completo de linguagem C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
track16.html

index << >>

16. Type-Casting de classes

16.1 Visão geral Normalmente o type-casting é usado para promover a conversão explícita entre tipos de dados, geralmente para assegurar a precisão na saida de um resultado. Uma situação básica aonde você precisa usar um type-casting é na divisão de números inteiros para garantir a precisão no resultado: int x = 3; int y = 2; float z = 0.0f; z = x / y; // Produz resultado indesejável: z = 1 z = (float) x / y; // Produz resultado preciso: z = 1.5 Existe uma outra forma de casting típica do c++, podemos escrever esta linha z = (float) x / y desta forma: z = static_cast<float> (x) / y; Tal como você faz com operadores em c++, você pode redefinir o significado de um type-casting. Por exemplo, você pode transformar um objeto monstro numa string e assim retornar uma string contendo uma lista para a exibição das propriedades de um objeto monstro. Em uma situação mais necessária você pode transformar um objeto Ponto em uma array de floats. Agora veja nosso programa:
// class_cast.cpp // esse programa ilustra o type casting de uma classe #include <iostream> #include <string> using namespace std; // protótipo das funções básicas void inicio(); void fim(); // declaração da classe monstro class Monstro { public: int m_estrago; string m_nome; Monstro(string snome = "monstro", int estrago = 10) { m_estrago = estrago; m_nome = snome; } // fim do construtor operator string() { char txt[255]; sprintf (txt, "(monstro:%s, estrago:%d)", m_nome.c_str(), m_estrago); string stemp = txt; return stemp; } // fim do casting para string }; // fim da classe monstro // início da função principal int main() { inicio(); int x = 3; int y = 2; float z = 0.0f; Monstro montro_ness("Ness",99); string info_monstro; string res_impreciso = "\t x=3 \t y=2 \t x / y ==> "; string res_preciso = "\t (float) x / y ==> "; string res_cast_monstro = "\t (string) montro_ness ==> "; string cast_exotico = "\t static_cast<float> (x) / y ==> "; z = x / y; cout << res_impreciso << z << "\n\n"; z = (float) x / y; cout << res_preciso << z << "\n\n"; info_monstro = (string) montro_ness; cout << res_cast_monstro << info_monstro << "\n\n"; z = static_cast<float> (x) / y; cout << cast_exotico << z << "\n\n"; fim(); } // endmain // implementação das funções básicas void inicio() { system("color f0"); system ("title class_cast.cpp"); cout << "\n"; } // endfunction void fim() { cout << endl; system("pause"); } // endfunction
Implementando o método que realiza o casting operator string() { char txt[255]; sprintf (txt, "(monstro:%s, estrago:%d)", m_nome.c_str(), m_estrago); string stemp = txt; return stemp; } // fim do casting para string O método que realiza o casting é implementado na forma exemplificada no código acima: operator tipo() { // bloco de código } Depois no bloco de código você manipula os membros e no final apresenta um retorno condizente com o casting solicitado. sprintf (txt, "(monstro:%s, estrago:%d)", m_nome.c_str(), m_estrago); Usamos a função sprintf() para imprimir as propriedades do objeto monstro numa c-string. Note que m_nome não é um tipo string mas sim um objeto da classe string e assim utilizamos o método c_str() desse objeto para retornar a c-string que esse objeto string representa. info_monstro = (string) montro_ness; Depois que o método foi definido, o casting é feito normalmente no estilo da linguagem c.
index << >>


Produzido por Gameprog: Jair Pereira - Fev/2006 - Junho/2013 © gameprog.br@gmail.com http://www.gameprog.com.br