Dasturlash II


Kerakli jixoz va vositalar


Download 297.3 Kb.
bet3/13
Sana07.03.2023
Hajmi297.3 Kb.
#1246573
1   2   3   4   5   6   7   8   9   ...   13
Bog'liq
Дастурлаш 2 Лаборатория иши 2021 (4)

Kerakli jixoz va vositalar: kompyuter, proyektor, ko‘rgazmali materiallar
Nazariy ma’lumot.
Noma’lum tiplar va noma’lum fazolar uchun dinamik tipni aniqlash va tipini almashtirish operatorlari zamonaviy obyektga yo‘naltirilgan dasturlashni qo‘llab-quvvatlovchi C++ dasturlash tilining ikkita vositalari, dinamik tipni aniqlash (runtime type identification RTTI) va qo‘shimcha tip qo‘yish operatorlari bilan bog‘liq. Bu vositalarning biri C++ spesifikatsiyasi qismi emasdi, lekin har ikki runtime polimorfizm uchun qo‘llab-quvvatlash uchun qo‘shilgan. RTTI dastur bajarish davomida obyekt turini aniqlash imkoniyati mavjudligini bildiradi. Bunda muhokama qilinayotgan tip turi tashlash operatorlari bu amalni bajarish uchun dasturchiga xavfsiz yo‘llarini taklif qiladi. Ulardan biri, dynamic_cast, bevosita RTTI aniqlash bilan bog’liq.
Tiplarni dinamik tarzda aniqlash. Ushbu vosits polimorf bo‘lmagan tillarda (masalan, C) mavjud emasligi sababli dinamik turdagi identifikatsiyalash bilan tanish bo‘lmasligingiz mumkin, chunki har bir obyektning tipi kompilyatsiya vaqtida (ya’ni, dasturni bajarishda) ma’lum bo‘lgani uchun dastur bajarilishida ma’lumot olishning hojati yo‘q. Biroq, C++ kabi polimorf tillarda obyekt tipi kompilyatsiya vaqtida noma’lum bo‘lgan holatlar bo‘lishi mumkin, chunki dastur bajarila boshlagunga qadar bu obyektning aniq tipi (tiplari) aniqlanmaydi. Ma’lumki, C++ sinf ierarxiyasi, virtual funksiyalar va ko‘rsatkichlari (pointer) asos sinflarga ishlatib polimorfizmni amalga oshiradi. Tayanch sinfga ko‘rsatkich bu tayanch sinf a’zolariga yoki undan olingan har qanday obyekt a’zolariga murojaat qilish uchun foydalanish mumkin. Shuning uchun asos sinfga ko‘rsatkichning istalgan vaqtda qanday turdagi obyektga murojaat qilishi har doim ham oldindan ma’lum emas. Bu faqat dastur ishlayotganida dinamik turdagi identifikatsiya vositalaridan biri yordamida aniqlanadi.
Dastur bajarilishi davomida obyekt tipini olish uchun typeid operatoridan foydalaniladi. Dastur bajarilayotgan vaqtda obyekt tipini olish uchun kutubxonasini kiritish va typeid operatoridan foydalanish mumkin. typeid operatoridan foydalanishning eng keng tarqalgan yozilish sintaktisi quyidagicha: typeid(object)
Bunda, object elementi tipini olish uchun obyektni anglatadi. Shuningdek, nafaqat ichki tipini, balki dasturchi tomonidan yaratilgan sinf tipini ham aniqlash mumkin. Buning uchun typeid operatori obyekt tipini tasvirlaydigan type_info obyektiga murojaat qiladi.
type_info sinfida public modifikatori bilan quyidagi static operatorlar aniqlangan bo'ldi.

bool operator == (const type_info &ob);
bool operator !=( const type_info &ob);

bool before(const type_info &ob);


const char *name();



Bunda qayta aniqlangan (overloaded) operatoriari [==] va [!=] tiplarini taqqoslash uchun ishlatiladi. Chaqiruvchi obyekt parametr sifatida ishlatiladigan obyekt (element ob) oldida ketma-ketlik tartibida bo'lsa before() funksiyasi true qaytaradi. Bu funksiya asosan ichki foydalanish uchun mo'ljallangan. Uning natija qiymati merosxo’r yoki sinf iyerarxik bilan hech qanday aloqasi yo'q. name() funksiyasi tip nomiga ko'rsatkich qaytadi.


typeid operatoridan foydalanishga bir misol keltiramiz.

1.1-dastur. Tiplarni taqqoslash



"stdafx.h" #include #include
#include
using namespace std;
class myclass {
};
int main() {
int i, j; float f;
myclass ob;
cout << "i oʻzgaruvchi
tipi: " <<
typeid (i).name() <typeid (f).name() <cout << "ob o'zgaruvchi tipi: " << typeid(ob).name() <if(typeid (i) == typeid(j)) cout << "1 vaj tiplar bir xil. \n";


if(typeid(i) I=typeid(f))
cout << 1 va f tiplar bir xil emas.\n";
system("PAUSE");
return 0;
}




11-dastur natijasi. Output

i o'zgaruvchi tipi: int
f o'zgaruvchi tipi: float
ob o'zgaruvchi tipi: class myclass
i vaj tiplar bir xil.
i va f tiplar bir xil emas

1.1-dastur tahlili. Dasturda int tipiga oid i va j, float tipida f, myclass tipida ob o'zgaruvchilari aniqlangan. typeinfo kutubxonasining typeid().name() metodi bilan ularning tiplari aniqlangan. Taqqolash operatorlari bilan o'zaguvchilarning tiplari tekshirilgan va natijalar ekranga chiqarilgan. Bu esa tiplar bo'yicha dastlabki ishlov berish uchun lozim.


1.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 obyektni o'chirish mumkin (virtual funksiyasi)

3

Operator==

O'zlashtirish amalidan foydalanib bo'lmaydi

4

Operator==
operator!=

Obyektlar bir xil tipgaligini taqqoslaydi (public funksiya)

5

before

Joriy tipdagi boshqa type index obyekt tomonidan nusxasi tipini bor yoki yo'qligini tekshiradi. Obyektlar, aniqrog'i tiplari, amalga oshirilishi belgilangan tartibda tashkil etiladi. (public funksiya)

6

hash_code

Joriy tipga mos keladigan tiplarni qaytaradi (public funksiya)

7

name

Aniqlangan joriy tip 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 obyekt tipini qaytaradi va uning asosidan olingan sinf tayanch sinf obyekt yoki obyekt emasligini ham ko’rsatadi.
Shuning uchun typeid operatoridan asos sinfga ko’rsatgich bilan murojaat qilingan obyekt tipini dinamik ravishda aniqlash uchun foydalanish mumkin. Buning xususiyat quyidagi dasturda ko’rsatilgan.
1.2-dastur. typeid operatorini polimorf sinflar ierarxiyasigaqo’llanilishi

#unclude “stdafx.h”
#unclude
#unclude
Using namespace std;
Class base {
Virtual void f() {}; // Asos sinf uchun polimorf
//…
};
Int main(){
Base “p, baseob;
myClass_one ob1;
myClass_two ob2;
p= &baseob;
cout <<”O’zgaruvchi p tipidagi obyektga ishora:”;
cout <p= &ob1;
cout <<”O’zgaruvchi p tipidagi obyektga ishora:”;
cout <p= &ob2;
cout <<”O’zgaruvchi p tipidagi obyektga ishora:”;
cout <system(“paause”);
return0;}




1.2-dastur natijasi. Output

O’zgaruvchi p tipidagi obyektga ishora: class base
O’zgaruvchi p tipidagi obyektga ishora: class
myClass_one
O’zgaruvchi p tipidagi obyektga ishora: class
myCLass_two



1.2-dastur tahlili. Dasturda dinamik ko'rsatkichli Base tipli p o'zgaruvchisi yaratilgan va 3 ta. Base tipiga bascob, my Class one tipiga obl, 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 dinamik ko'rinishda o'zgardi.
typeid operatori polimorf turdagi tayanch sinfga ko'rsatkich sifatida qo'llanilsa, haqiqiy manzillangan obyektning tipini dastur bajarilayotgan vaqtda aniqlaydi.
Typeid operatori polimorf bo'lmagan iyerarxik sinflar uchun ko'rsatkich qo'llaniladigan barcha hollarda, tayanch tipi uchun ko'rsatkich bo'ladi. Boshqa so'zlar bilan aytganda, bu ko'rsatkich aslida tipni aniqlash mumkin emas. Tajriba sifatida 1.2-dasturdagi asos sinfdagi ft) virtual funksiyani izohga oling va natijani tekshirib ko'ring. Dasturda bu o'zgarishni amalga oshirgandan so'ng har bir turli tipli obyektning tipi Base deb aniqlanishini ko'rasiz, chunki bu p ko'rsatkichga 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 ko'rsatkich null bo'lib chiqqanda vaziyatni boshqarish t uchun maxsus istisno yaratiladi. Bu holda, typeid operatori bad_typeid istisnosiga o'tadi.
Polimorf sinflar ierarxiyasidagi obyektlarga havolalar ko'rsatkichlar kabi ishlaydi. typeid operatori polimorf sinfning mos yozuvlar uchun qo'llaniladigan bo'lsa, u aslida obyekt tipini qaytaradi va u asosiy tipi o'rniga olingan tipdagi obyekt bo'lishi mumkin. Bu usul o'zgaruvchilarni funksiyalarga murojaat qilib o'tishda eng ko'p qo'llaniladi.



Download 297.3 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   13




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling