Qiymatli konteynerlar – bu obyektlarning nusxalarini saqlaydigan kompozitsiyalar (va shuning uchun bu nusxalarni yaratish / yo'q qilish uchun javobgardir).
Havola konteynerlari – boshqa obyektlarga ko'rsatgichlar yoki havolalarni saqlaydigan agregatsiyadir(shuning uchun bu ob'ektlarni yaratish/yo'q qilish uchun javobgar emas).
Haqiqiy hayotdan farqli o'laroq, konteynerlar o'z ichiga joylashtirilgan har qanday turdagi obyektni saqlashi mumkin bo'lsa, C++ da konteynerlar odatda faqat bitta ma'lumot turini o'z ichiga oladi. Misol uchun, agar sizda butun sonli massiv bo'lsa, u faqat butun son qiymatlarini o'z ichiga olishi mumkin. Boshqa ba'zi dasturlash tillaridan farqli o'laroq, C++ bir xil konteyner ichida turli xil ma'lumotlar turlarini aralashtirishga ruxsat bermaydi. Agar sizga int va double qiymatlarini saqlash uchun konteynerlar kerak bo'lsa, unda siz ikkita alohida konteyner yozishingiz kerak bo'ladi (yoki biz tegishli darsda gaplashgan shablonlardan foydalaning). Foydalanish cheklovlariga qaramay, konteynerlar juda foydali, chunki ular dasturlashni oson, xavfsizroq va tezroq qiladi.
Massiv konteyner sinfi. Endi biz C++ tilida konteynerlar funksiyasini amalga oshirgan holda noldan butun sonli massiv sinfini yozamiz. Ushbu massiv klassi elementlarning o'zi emas, balki ularning nusxalarini saqlaydigan qiymat konteyneri turiga kiradi.
Birinchidan, ArrayInt.h faylini yaratamiz:
#ifndef ARRAYINT_H
#define ARRAYINT_H
class ArrayInt
{
};
#endif
Bizning ArrayInt ikkita qiymatni kuzatishi kerak: ma'lumotlar va uning uzunligi. Biz massivimiz uzunligini o‘zgartirish imkoniyatiga ega bo‘lishini xohlayotganimiz uchun biz dinamik xotira ajratishdan foydalanishimiz kerak, ya’ni ma’lumotlarni saqlash uchun ko‘rsatgichdan foydalanamiz:
#ifndef ARRAYINT_H
#define ARRAYINT_H
class ArrayInt
{
private:
int m_length;
int *m_data;
};
#endif
Endi biz ArrayInt sinfi obyektlarini yaratish imkoniyatiga ega bo'lish uchun konstruktorlarni qo'shishimiz kerak. Biz ikkita konstruktorni qo'shamiz: birinchisi bo'sh massivni yaratadi, ikkinchisi berilgan o'lchamdagi massivni yaratadi:
#ifndef ARRAYINT_H
#define ARRAYINT_H
#include
class ArrayInt
{
private:
int m_length;
int *m_data;
public:
ArrayInt():
m_length(0), m_data(nullptr)
{
}
ArrayInt(int length):
m_length(length)
{
assert(length >= 0);
if (length > 0)
m_data = new int[length];
else
m_data = nullptr;
}
};
#endif
Bizga ArrayIntni tozalaydigan funksiyalar ham kerak. Birinchidan, dinamik ravishda ajratilgan har qanday xotirani shunchaki ajratadigan destruktorni qo'shamiz. Ikkinchidan, biz massivni o'chiradigan va uning uzunligini 0 ga qaytaradigan erase() funksiyasini yozamiz:
~ArrayInt()
{
delete[] m_data;
// Bu yerda m_data uchun null belgilash yoki
//m_length = 0 qilish shart emas, chunki obyekt baribir yo'q qilinadi.
}
void erase()
{
delete[] m_data;
// Bu yerda biz m_data ni nullptr ga o'rnatishimiz kerak,
//shunda chiqishda osilgan ko'rsatkich bo'lmaydi.
m_data = nullptr;
m_length = 0;
}
Endi massiv elementlariga kirish uchun indekslash operatorini [] qayta yuklaymiz. Shuningdek, biz o'tgan indeksni tekshirishni amalga oshirishimiz kerak, bu eng yaxshi assert bayonoti bilan amalga oshiriladi. Massiv uzunligini qaytarish uchun yordamchi funksiyani ham qo‘shamiz:
Do'stlaringiz bilan baham: |