• 1.2-dastur. Typeid operatorini polimorf sinflar ierarxiyasiga qo‘llanilishi.
  • Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash




    Download 0,81 Mb.
    bet3/143
    Sana20.07.2024
    Hajmi0,81 Mb.
    #268096
    1   2   3   4   5   6   7   8   9   ...   143
    Bog'liq
    Tiplarni dinamik tarzda-fayllar.org

    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 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.2dastur 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.

    Download 0,81 Mb.
    1   2   3   4   5   6   7   8   9   ...   143




    Download 0,81 Mb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash

    Download 0,81 Mb.