Здорова господа!
Сейчас мы разберем такую от фигню механизма RTTI (Run-time type identification) как операция typeid(). Я так понял она применяется для приведения типа или для проверки во время исполнения программы. Я щас если честно путаюсь в этих понятиях. Но щас все разберем.
Так подчитал чуток операция typeid() это просто фигня такая которая может сравнивать ссылки. Чтобы его использовать нужно подключить заголовочный файл #include <typeinfo> и больше ничего никаких using мы не прописываем. Дальше можно просто создавать объекты и просто их сравнивать например typeid(p)==typeid(c); если они равны, то вернется true, есил нет то false. Вот примерчик простой я наколякал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//operaci9 typeid #include <iostream> using std::cout; using std::endl; #include <typeinfo> class A{}; class B : public A{}; class C : public A{}; int main() { B bb; B bbb; C cc; A* ab=&bb; A* ac=&cc; cout <<typeid(ab).name()<<endl;//eto fignyu kakyyuto ono vuvodit //ocnovnoe primenenie eto cravnenie tipov if(typeid(bb)==typeid(cc)) cout <<"Один и тот же тип (равны)"<<endl; else cout <<"ne ravnu"<<endl; //ocnovnoe primenenie eto cravnenie tipov if(typeid(bb)==typeid(bbb)) cout <<"Один и тот же тип (равны)"<<endl; else cout <<"ne ravnu"<<endl; return 0; } |
typeid() может принимать как ссылку, указатель и сам объект. В нем еще есть несколько дополнительных функций я их разбирать не буду. Ага еще вычитал, что если значение указателя полиморфного типа равно нулю, то операция typeid() генерирует исключение bad_typeid. Щас попробуем вызвать это исключение.
Да как я не изворачивался так я это исключение вызвать и не смог. Хоть я и ноль присваивал объекту полиморфного типа хоть и не NULL ничего не получается, исключение не вылетает вот примерчик того что я делал и не смог вызвать исключение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//operaci9 typeid #include <iostream> using std::cout; using std::endl; #include <typeinfo> #include <exception> using std::exception; class A { public: virtual void print(){} }; class B : public A{}; class C : public A{}; int main() { try { B bb; B* bPtr=&bb; A* ab=&bb;//ykazatel6 ne polimorfnogo tipa typeid(ab);//ne ravno 0 znachit nety throw ab=0; bPtr=0; ab=bPtr; typeid(ab); typeid(bPtr); typeid(bPtr); } catch(exception& e) { cout <<e.what()<<endl; cout <<"owibka"<<endl; } return 0; } |
Ну да ладно с этой фигней разобрались, а теперь попробуем применить typeid() в место dynamic_cast() сделаем аналогичный код только с нашим typeid().
Два примера я вымучил и для ссылок и для указателей оказывается для сравнения нужно передавать объекты. Указатели оказываются не сравниваются. Нужно токо именно разыменовывать их, чтобы сравнить объекты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
//primeru c typeid() #include <iostream> using std::cout; using std::endl; #include <cstdlib> using std::exit; #include <typeinfo> class A { public: virtual void polimorf(){} virtual void print(){} }; class B : public A { public: void print() { cout <<"fynkci9 print iz klacca B"<<endl; } }; class C : public A {}; void my_funk(A& o) { if(typeid(o)==typeid(B)) { o.print(); } else { cout <<"proizowka owibka ne cootvetctvie"<<endl; exit(1); } } void funk(A* o) { //if(typeid(o)==typeid(B*) ) //owibka: ykazateli ne cravnivayutc9 if(typeid(*o)==typeid(B) ) { cout <<"delaem kakieto deictvi9"<<endl; } else { cout <<"proizowla owibka ne cootvetctvie"<<endl; exit(1); } } int main() { B c; my_funk(c); cout <<endl<<endl; B* p=&c; funk(p); return 0; } |
Все добавить мне пока нечего. Не переключайте канал, потом мб что то и добавлю как скил повышу 🙂 .
[youtube]http://www.youtube.com/watch?v=8AeRzGPBWJU[/youtube]