-jadval. Type_info - Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash

|
Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash
|
bet | 3/143 | Sana | 20.07.2024 | Hajmi | 0,81 Mb. | | #268096 |
Bog'liq Tiplarni dinamik tarzda-fayllar.org1.1-jadval. Type_info sinf aʻzolari va vazifalari
№
|
Funksiya
nomi
|
vazifasi
|
1
|
(constructor)
|
Sinfda standart va nusxa konstruktori mavjud emas.
|
2
|
(destructor)
[virtual]
|
xavfsiz tayanch sinf uchun pointer orqali obʻyektni o‘chirish
mumkin (virtual funksiyasi)
|
3
|
operator=
|
O‘zlashtirish amalidan foydalanib ko‘chirib bo‘lmaydi
|
4
|
operator==
operator!=
|
Obʻyektlar bir xil tipgaligini taqqoslashydi
(public funksiya)
|
5
|
before
|
Joriy tipdagi boshqa type_index obʻyekt tomonidan nusxasi tipini bor yoki yo‘qligini tekshiradi. Obʻyektlar, aniqrog‘i tiplari, amalga oshirilishi belgilangan tartibda tashkil etiladi.
(public funksiya)
|
6
|
hash_code
|
Joriy tipga mos keladigan tiplarni qaytaradi
(public funksiya)
|
7
|
name
|
Joriy tipning aniqlangan nomini qaytaradi.
(public funksiya)
|
Typeid operatori polimorf tayanch sinf uchun ko‘rsatkich sifatida qo‘llaniladigan bo‘lsa (eslabtib o‘tamiz, polimorf sinf kamida bitta virtual funksiyani o‘z ichiga olgan sinfga aytiladi), u avtomatik ravishda real obʻyekt tipini qaytaradi va u asossidan olingan sinf tayanch sinf obʻyekt yoki obʻyekt emasligini ham ko‘rsatadi.
Shuning uchun typeid operatoridan asos sinfga ko‘rsatgich bilan murojaat qilingan obʻyekt tipini dinamik ravishda aniqlash uchun foydalanish mumkin. Bu xususiyat quyidagi dasturda ko‘rsatilgan.
1.2-dastur. Typeid operatorini polimorf sinflar ierarxiyasiga qo‘llanilishi.
#include "stdafx.h"
#include
#include
using namespace std; class Base {
virtual void f() {}; // Asos sinf uchun polimorf
// . . .
};
class myClass_one: public Base {
// . . .
};
class myClass_two: public Base {
// ...
};
int main(){
Base *p, baseob; myClass_one ob1; myClass_two ob2; p = &baseob;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
p = &ob1;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
p = &ob2;
cout << " O'zgaruvchi p tipdagi obyektga ishora: "; cout << typeid(*p).name() << endl;
system("pause"); return 0;}
1.2 – dastur natijasi. Output
O'zgaruvchi p tipdagi obyektga ishora: class Base O'zgaruvchi p tipdagi obyektga ishora: class myClass_one
O'zgaruvchi p tipdagi obyektga ishora: class myClass_two
1.2-dastur tahlili. Dasturda dinamik ko‘rsatkichli Base tipli p o‘zgaruvchisi yaratilgan va 3 ta, base tipiga baseob, myClass_one tipiga ob1, myClass_two tipiga ob2 mos o‘zgaruvchilar yaratilgan. Dastur davomida dinamik o‘zgaruvchiga oddatiy o‘zgaruvchilar qiymat qilib berilgan. Natija shu maʻlum bo‘ldiki dinamik o‘zgaruvchining tipi danamik ko‘rinishda o‘zgardi.
Typeid operatori polimorf turdagi tayanch sinfga ko‘rsatgich sifatida qo‘llanilsa, haqiqiy manzillangan obʻyektning tipini dastur bajarilayotgan vaqtda aniqlaydi.
Typeid operatori polimorf bo‘lmagan iyerarxik sinflar uchun ko‘rsatkich qo‘llaniladigan barcha hollarda, tayanch tipi uchun ko‘rsatikich bo‘ladi. Boshqa so‘zlar bilan aytganda, bu ko‘rsatkich aslida tipni aniqlash mumkin emas. Tajriba sifatida 1.2-dasturdagi asos sinfdagi f() virtual funksiyani izohga oling va natijani tekshirib ko‘ring. Dasturda bu o‘zgarishni amalga oshirgandan so‘ng har bir turli tipli obʻyektning tipi base deb aniqlanishini ko‘rasiz, chunki bu p ko‘rsatgichga ega bo‘lgan tipdir.
Typeid operatori odatda kengqirrali ko‘rsatkich (dereferenced pointer yaʻni, [*] operatoriga ega bo‘lgan ko‘rsatkich) uchun qo‘llanilganligi sababli, bu bu ko‘rsatkich null bo‘lib chiqqanda vaziyatni boshqarish uchun maxsus istisno yaratiladi. Bu holda, typeid operatori bad_typeid istisnoga o‘tadi.
Polimorf sinflar ierarxiyasidagi obʻyektlarga havolalar ko‘rsatgichlar kabi ishlaydi. Typeid operatori polimorf sinfning mos yozuvlar uchun qo‘llaniladigan bo‘lsa, u aslida obʻyekt tipini qaytaradi va u asosiy tipi o‘rniga olingan tipdagi obʻyekt bo‘lishi mumkin. Bu usul o‘zgaruvchilarni funksiyalarga murojaat qilib o‘tishda eng ko‘p qo‘llaniladi. Masalan, quyidagi (1.3-dastur) dasturda WhatType() funksiyasi asosiy tipdagi obʻyektlarga mos yozuvlar parametrini eʻlon qiladi. Demak, WhatType() funksiyasi bazaviy turdagi obʻyektlarga murojaatlarni yoki asos sinfdan olingan har qanday sinf obʻyektlariga murojaatlarni keltirib chiqaradi. Bunday parametrlarga qo‘llaniladigan typeid operatori funksiyaga o‘tgan obʻyektning haqiqiy turini qaytaradi.
|
| |