[C++] Ce este clasa type_info?

Despre limbajul de programare C++ si biblioteca standard STL (forum moderat)

[C++] Ce este clasa type_info?

Mesajde Ovidiu Cucu » 29 Aug 2011, 14:13

Intrebare
Ce este clasa type_info?

Raspuns
Clasa type_info este definita in fisierul standard <typeinfo> si serveste la identificarea tipului la run-time (RTTI).
Operatorul typeid intoarce o referinta la un obiect de tip type_info.

Exemple
Cod: Selectaţi tot
#include <typeinfo>
#include <iostream>

class CFoo {/*...*/};

int main()
{
   CFoo foo;
   // ...
   const std::type_info& ti = typeid(foo);
   std::cout << "foo is of type '" << ti.name() << "'" << std::endl; 
   // ...
   return 0;
}
Cod: Selectaţi tot
#include <typeinfo>
#include <iostream>

class CFoo {/*...*/};

int main()
{
   CFoo foo;
   // ...
   if(typeid(foo) == typeid(CFoo))
   {
      std::cout << "foo is of type 'class CFoo'" << std::endl;
   }
   // ...
   return 0;
}
Cod: Selectaţi tot
#include <typeinfo>
#include <iostream>

class CFoo {/*...*/};

int main()
{
   CFoo foo1, foo2;
   // ...
   if(typeid(foo1) == typeid(foo2))
   {
      std::cout << "foo1 and foo2 have the same type" << std::endl;
   }
   // ...
   return 0;
}


Note
  1. Clasa type_info are un singur constructor (copy constructor), declarat privat deci nu poate fi instantiata in mod direct.
    Exemple
    Cod: Selectaţi tot
       std::type_info ti(typeid(CFoo)); // Error: 'type_info::type_info'
                                        // cannot access private member
    Cod: Selectaţi tot
    std::type_info ti; // Error: no appropriate default constructor

  2. In plus fata de constructorul de copiere, este privat si operatorul de atribuie, deci un obiect tip type_info nu este copiabil.
    Exemplu
    Cod: Selectaţi tot
       std::type_info& t1 = const_cast<std::type_info&>(typeid(CFoo));
       std::type_info& t2 = const_cast<std::type_info&>(typeid(CBar));
       t1 = t2; // Error: 'type_info::operator ='
                // cannot access private member declared in class 'type_info'

  3. Operatorul typeid arunca o exceptie tip bad_typeid atunci cand i se paseaza un type_info invalid.
    Exemple
    Cod: Selectaţi tot
       try
       {
          type_info* pti = NULL;
          const type_info& ti = typeid(*pti);
       }
       catch(std::bad_typeid& e)
       {
          std::cout << e.what() << std::endl;
          // "Attempt a typeid of NULL pointer!"
       }
    Cod: Selectaţi tot
       try
       {
          // stupid but possible
          int i = 666;
          type_info* pti = reinterpret_cast<type_info*>(&i);
          if(typeid(*pti) == typeid(double))
             // ...
       }
       catch(std::bad_typeid& e)
       {
          std::cout << e.what() << std::endl;
          // "Access violation - no RTTI data!"
       }

  4. Stringurile intoarse de std::type_info::name() si std::bad_typeid::what() depind de compilator (implementation-defined).
Resurse
Vezi si


<< Back to C++ Index
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3772
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Înapoi la C++

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator

cron