-dastur. Typeid - Tiplarni dinamik tarzda

|
Tiplarni dinamik tarzda
|
bet | 9/131 | Sana | 24.01.2024 | Hajmi | 1,92 Mb. | | #144844 |
Bog'liq Tiplarni dinamik tarzda1.8-dastur. Typeid operatori o‘rniga dynamic_cast operatoridan foydalanish.
#include "stdafx.h" #include #include using namespace std; class Base {
public:
virtual void f() {}
};
class MyClass : public Base { public:
void derivedOnly() {
cout << "Bu MyClass obʻyekti.\n";
}
};
int main(){
Base *bp, b_ob; MyClass *dp, d_ob;
// typeid operatoridan foydalanish
bp = &b_ob;
|
if(typeid(*bp) == typeid(MyClass)) { dp = (MyClass *) bp;
dp->derivedOnly();
} else
cout <<" Base tipidagi obʻyekt MyClass almashtirilmadi. \n"; bp = &d_ob;
if(typeid(*bp) == typeid(MyClass)) { dp = (MyClass *) bp;
dp->derivedOnly();
} else
cout <<"Xatolik, tip almashtirish yozilmagan! \n";
// dynamic_cast operatoridan foydalanish bp = &b_ob;
dp = dynamic_cast (bp); if(dp) dp->derivedOnly();
else cout << " Base tipidagi obʻyekt MyClass almashtirilmadi. \n"; bp = &d_ob;
dp = dynamic_cast (bp); if(dp) dp->derivedOnly();
else cout << "Xatolik, tip almashtirish yozilmagan! \n"; system("pause");
return 0;
}
|
1.8 – dastur natijasi. Output
|
Base tipidagi obʻyekt MyClass almashtirilmadi. Bu MyClass obʻyekti.
Base tipidagi obʻyekt MyClass almashtirilmadi.
Bu MyClass obʻyekti.
|
1.8-dasturdan ko‘rinadiki, asos sinfning ko‘rasatkichini MyClass ko‘rsatkichiga almashtirishda dynamic_cast operatorini qo‘llash dastur mantig‘ini qulayroq qiladi. Yuqoridagi dastur natijasiga qarang. Shuningdek, dynamic_cast operatorini shablon sinflarga ham qo‘llash mumkin.
const_cast operatori. Const_cast operatori const va/yoki volatile o‘zgartirgichlarni qayta aniqlash uchun xizmat qiladi.
Const_cast operatori const va / yoki volatile o‘zgartirgichlarni ochiq qayta aniqlash/joriy qilish uchun ishlatiladi. const yoki volatile ning atrubutlariga istesno tariqasida, yangi tipi joriy tipi bilan mos bo‘lishi kerak. Ko‘pincha const_cast
operatori const atributini olib tashlash uchun ishlatiladi. Uning umumiy formati quyidagicha:
Bu yerda type elementi yangi tipga almatirish tipini o‘rnatadi, expr elementi esa yangi tipga tipi almatirilishi kerak bo‘lgan o‘zgaruvchi(ifoda)ni bildiradi.
1.9-dastur. Const_cast operatoridan foydalanish.
#include "stdafx.h"
#include #include
using namespace std;
void f (const int *p){ int *v;
v = const_cast (p); // const-oʻzgaruvchini qayta almashtirish.
*v = 1980; // yangi qiymat berish, modifikatsiyalash
}
int main(){
int x = 2004;
cout <<" f() funksiya chaqirilmasdan oldin x ni qiymati: " << x<< endl; f (&x);
cout <<" f() funksiya chaqirilgandan soʻng x ni qiymati: " << x<< endl; system("pause");
return 0;
}
|
1.9 – dastur natijasi. Output
|
f() funksiya chaqirilmasdan oldin x ni qiymati: 2004
f() funksiya chaqirilgandan soʻng x ni qiymati: 1980
|
Ko‘rib turganingizdek, x o‘zgaruvchi qabul qilgan parametr const ko‘rsatgichi sifatida o‘rnatildi va f() funksiyasi tomonidan o‘zgartirilgan.
Const atributini o‘chirish uchun const_cast operatoridan foydalanish xavfli darajadagi vosita ekanligini alohida taʻkidlash lozim. Shuning uchun, juda diqqat bilan foydalanishni tavsiya qilamiz.
Faqat const_cast operatori const atributini o‘chirishi mumkinligini bilib oldingiz. Boshqa so‘zlar bilan aytganda, na dynamic_cast, static_cast, yoki reinterpret_cast obʻyekt const atributini o‘zgartirish uchun foydalanish mumkin emas.
|
| |