Muhamma al-xorazmiy nomidagi toshkent axborot texnalogiyalari universiteti nurafshon filiali


Download 47.16 Kb.
bet3/4
Sana13.04.2023
Hajmi47.16 Kb.
#1351119
1   2   3   4
Bog'liq
nodir

1.3-dastur. Typeid operatorini havolali parametriga qo‘llash.
#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 {
// ...
};
void WhatType(Base &ob){
cout << " ob parametri ob'ekt tipiga havolasi: "; cout << typeid(ob).name() << endl;
}
int main(){ Base baseob;
myClass_one ob1; myClass_two ob2; WhatType(baseob); WhatType(ob1); WhatType(ob2); system("pause"); return 0;
}

1.3 dastur natijasi. Output
ob parametri ob'ekt tipiga havolasi: class Base
ob parametri ob'ekt tipiga havolasi: class myClass_one ob parametri ob'ekt tipiga havolasi: class myClass_two
1.3-dastur tahlili. Dasturda WhatType funksiyasi yaratilib, unga asos sinf tipidpgi havolali parametr belgilandi. Asosiy funksiyada 3 ta, base tipiga baseob, myClass_one tipiga ob1, myClass_two tipiga ob2 mos o‘zgaruvchilar yaratilgan. Dastur davomida WhatType funksiyasining havolali parametrga oddatiy o‘zgaruvchilar qiymat qilib berilgan. Natija shu maʻlum bo‘ldiki, dinamik o‘zgaruvchining tipi danamik ko‘rinishda o‘zgardi.
Dasturlash jarayonlarida o‘zgaruvchilarni tiplarini real tip bilan taqqoslashga to‘g‘ri keladi. Buning uchun typeid operatori agrgument sifatida tipi nomini olish yordamida amalga oshiriladi. Uning yozilishi quyidagicha:

tyreid(tip nomi)

Masalan, quyidagi listing amal qiladi.

Cout<

Typeid operatorini ushbu variantda ishlatilishining maqsadi tipni taqqoslash uchun foydalanishdir, (belgilangan maʻlumotlar tipini taʻriflaydi) ammo, type_info obʻyektini olish uchun emas.
Dinamik tipni aniqlashni (RTTI) qo‘llash. Dasturda dinamik tipni aniqlash (identifikatsiya) vositasi (RTTI) imkoniyati va foydali bo‘lishi mumkinlingini ko‘rsatib o‘tamiz. Masalan, geometrik shakllar uchun iyerarxik sinf berilgan bo‘lsin, unda doira, uchburchak va to‘rtburchak maydoni hisoblash usullari mavjud. Ushbu dasturda doira, uchburchak yoki to‘rtburchakni yaratish uchun mo‘ljallangan funksiyasi factory() bo‘lsin. Ushbu funksiya yaratilgan obʻyektga bir nusxani qaytadi. Obʻyektlarni hosil qiluvchi funksiya baʻzan obʻyekt fabrikasi deb ataladi. Yaratilayotgan obʻyektning o‘ziga xos tipi C++ tasodifiy sonlar generatorining Rand() funksiyasiga kirish orqali aniqlanadi. Demak, qanday turdagi obʻyekt hosil bo‘lishini oldindan bilolmaymiz. 1.4-dasturda o‘nta obʻyekt yaratadi va har bir turdagi yaratilgan obʻyektlar sonini hisoblaydi. factory() funksiyasini chaqirishda har qanday shakl turini hosil qilish mumkinligi sababli, dastur aslida yaratilgan obʻyekt tipini aniqlash uchun typeid operatoridan foydalanadi.
1.4-dastur. Dinamik tipdagi identifikatsiya vositasidan foydalanish.
#include "stdafx.h"
#include
#include
#include
using namespace std;
class figure {
protected:
double x, y; public:
figure(double i, double j) { x = i;
y = j;
}
virtual double area() = 0;
};
class triangle : public figure { public:
triangle(double i, double j) : figure(i, j) {} double area() {
return x * 0.5 * y;
}
};
class rectangle : public figure { public:
rectangle(double i, double j) : figure (i, j) {} double area() { return x * y;}
};
class circle : public figure { public:
circle(double i, double j=0) : figure(i, j) {} double area() {return 3.14 * x * x;}
};
// figure sinf obʻyektlarini yaratish. figure *factory(){
switch(rand() % 3 ) {
case 0: return new circle (rand()%15);
case 1: return new triangle (rand()%15,rand()%15); case 2: return new rectangle (rand()%15, rand()%15);
}
return 0;
};
int main(){
figure *p; // asos sinfga koʻrsatkich int i;
int t=0, r=0, c=0;
// 5 ta obʻyektlarni hosil qilsh va sanash for(i=0; i<15; i++) {
p = factory(); // obʻyektni hosil qilish
cout << "Obʻyektning tipi: " << typeid(*p).name(); cout << ". ";
// obʻyektni tekshirish orqali sanasj if(typeid(*p) == typeid(triangle)) t++; if(typeid(*p) == typeid(rectangle)) r++; if(typeid(*p) == typeid(circle)) c++;
// Yuzasini hisoblash
cout << " S= " << p->area() << endl;
}
cout << endl;
cout << "Quyidagi obʻyektlar hosil qilindi:\n"; cout << " Uchburchaklar: " << t << endl;
cout << " Toʻrtburchaklar: " << r << endl; cout << " Doiralar: " << c << endl; system("pause");
return 0;
}
1.4 dastur natijasi. Output
Obʻyektning tipi: class rectangle. S= 8 Obʻyektning tipi: class triangle. S= 28 Obʻyektning tipi: class circle. S= 28.26 Obʻyektning tipi: class triangle. S= 35 Obʻyektning tipi: class rectangle. S= 12 Obʻyektning tipi: class triangle. S= 55 Obʻyektning tipi: class rectangle. S= 72 Obʻyektning tipi: class circle. S= 254.34 Obʻyektning tipi: class rectangle. S= 21 Obʻyektning tipi: class triangle. S= 33 Obʻyektning tipi: class rectangle. S= 10 Obʻyektning tipi: class circle. S= 379.94 Obʻyektning tipi: class circle. S= 254.34 Obʻyektning tipi: class triangle. S= 4 Obʻyektning tipi: class triangle. S= 36
Quyidagi obʻyektlar hosil qilindi: Uchburchaklar: 6
Toʻrtburchaklar: 5
Doiralar: 4

Download 47.16 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




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