O'zi o'qiydigan va yozadigan sinflar
Faraz qilaylik, sizning xotirangizda ko'plab ob'ektlar bor va siz ularning barchasini faylga yozmoqchisiz.
Bu har bir ob'ekt uchun a'zo funktsiyasi faylni ochish, unga bitta ob'ekt yozish va
keyin REWOBJ misolidagi kabi uni yoping. Bu juda tezroq va qancha ob'ektlar mavjud bo'lsa
Bu to'g'riroq - faylni bir marta ochish, unga barcha ob'ektlarni yozish va keyin uni yopish.
Statik funksiyalar
Bir vaqtning o'zida ko'plab ob'ektlarni yozishning usullaridan biri statik a'zo funktsiyasidan foydalanishdir har bir ob'ekt uchun emas, balki butun sinf sifatida. Bu funksiya bir vaqtning o'zida barcha ob'ektlarni yozishi mumkin. Qanday
Bunday funktsiya barcha ob'ektlarning qaerdaligini biladimi? U ko'rsatgichlar qatoriga kirishi mumkin statik ma'lumotlar sifatida saqlanishi mumkin bo'lgan ob'ektlar. Har bir ob'ekt yaratilganda, unga ko'rsatgich saqlanadi bu massiv.
Statik ma'lumotlar a'zosi qancha ob'ekt yaratilganligini ham kuzatib boradi. The
static write() funksiyasi faylni ochishi mumkin; keyin har birini yozgan holda massivdan o'ting
o'z navbatida ob'ekt; va nihoyat faylni yoping.
Olingan ob'ektlarning o'lchami
Ishlarni chindan ham qiziqarli qilish uchun keling, yana bir taxmin qilaylik: ob'ektlar saqlangan xotira hajmi har xil. Nima uchun bu haqiqat bo'ladi? Bu holat odatda bir nechta sinflar asosiy sinfdan olinganida yuzaga keladi. Masalan, EMPLOY dasturini ko'rib chiqing
“Meros”. Bu erda bizda asosiy sinf vazifasini bajaradigan xodimlar sinfi mavjud
boshqaruvchi, olim va ishchi sinflari. Ushbu uchta hosila sinfning ob'ektlari har xil
o'lchamlari, chunki ular turli xil miqdordagi ma'lumotlarni o'z ichiga oladi. Xususan, ismga qo'shimcha ravishda va barcha xodimlarga tegishli bo'lgan xodim raqami, menejer unvon va golf klubi to'lovlariga ega va olimning qator nashrlari bor.
Biz olingan ma'lumotlarni barcha uch turdagi ob'ektlarni o'z ichiga olgan ro'yxatdan yozmoqchimiz (menejer, olim va ishchi) oddiy sikl va write() aʼzo funksiyasidan foydalangan holda oqimdan tashqari. Ammo bu funktsiyadan foydalanish uchun ob'ekt qanchalik katta ekanligini bilishimiz kerak, chunki bu uning ikkinchi argumentidir.
Faraz qilaylik, bizda xodim tipidagi ob'ektlarga ko'rsatgichlar majmuasi (uni arrap[] deb ataymiz). Bular
ko'rsatkichlar uchta olingan sinf ob'ektlariga ishora qilishi mumkin. (Bobdagi VIRTPERS dasturiga qarang
Olingan sinflar ob'ektlariga ko'rsatgichlar qatoriga misol uchun
11.) Biz bilamizki, agar biz virtual funktsiyalardan foydalanib, biz kabi bayonotlar qilishimiz mumkin
arrap[j]->putdata();
Putdata() funktsiyasining ko'rsatgich ko'rsatgan ob'ektga mos keladigan versiyasi bo'ladi asosiy sinfdagi funksiyadan ko'ra foydalaniladi. Lekin biz ham sizeof() funksiyasidan foydalana olamizmi? ko'rsatgich argumentining hajmini qaytarasizmi? Ya'ni, aytish mumkin
ouf.write( (char*)arrap[j], sizeof(*arrap[j]) ); // no good
Yo'q, chunki sizeof() virtual funktsiya emas. U turini hisobga olish kerakligini bilmaydi ko'rsatgich turi emas, balki ko'rsatilgan ob'ekt. U har doim o'lchamini qaytaradi
asosiy sinf ob'ekti.
Do'stlaringiz bilan baham: |