Похідні класи на прикладі векторів

Вектором називається одновимірний масив, що дає максимальну ефективність при виконанні та мінімальні втрати пам’яті. Недоліками вектора є: необхідність задавати розмір вектора як константу, відсутність автоматичної перевірки меж. Ці моменти необхідно відслідковувати вручну, вставляючи в відповідних місцях програми перевірки.

class Vector{

int *V;

int SZ;

public:

Vector(int);

~Vector();

int SIZE(){return SZ;} //індекси в діапазоні від 0 до SIZE-1

int Set_SIZE(int);

int &operator[](int); //доступ з перевіркою меж

int &elem(int i){return V[i]} //доступ до елементів без перевірки індексів

}

Vector::Vector(int S){

if (S=<0) error(“bad vector size”);

else SZ=S;

V = new int[SZ];

}

void main(){

Vector V1(100);

Vector V2(n*2-4);

}

int &Vector::operator[](int i){

if ((i<0)||(size<=i))error(“vector index out of range”);

return V[i];}

Vector::~Vector(){

delete V;}

Завдання полягає у розробці класу, як структуру фіксованого розміру, яка керує доступом до реальної пам’яті вектора. Ця пам’ять резервується в конструкторі через оператор new. Операцію доступу до елемента вектора з перевіркою меж. Логічний оператор «або» має лівий і правий опернди, і його правий операнд оцінюється лише у випадку необхідності, тобто тоді коли значення лівого операнда дорівнює нулю. Повернення звертання за адресою гарантує, що квадратні дужки можна використовувати з обох сторін операцій присвоєння. Деструктор класу Vector оголошений для неявного виклику при виході об’єкту з області дії. Після звільнення пам’яті, вона може використовуватись повторно. Вказівник пов’язаний з вектором очищується. Визначимо похідний клас, в якому користувач може задати межі індексу.

class Vec:public Vector{

int low, high;

public: Vec(int, int)

int &elem(int);

int &operator[](int);

}

int &Vec::elem(int i){

return Vector::elem(int i);

{

Клас Vec наслідує всі функції класу Vector та має власні властивості в конструкторі класу Vec задаються дві границі індексу, а не розмір як в класі Vector. Функція elem класу Vec використовує функцію elem класу Vector.

Масиви об’єктів

При оголошенні масиву компілятору повідомляється тип та кількість об’єктів, що розміщується в даному масиві. Компілятор визначає розмір пам’яті для одного елемента масиву на основі оголошення класу. Щоб об’єкти можна було створити при оголошенні масиву, клас повинен володіти стандартним конструктором без параметрів. Доступ до членів об’єкту, що знаходяться в масиві відбувається в два етапи: спочатку використовується оператор індексу «[]», який ідентифікує елемент масиву, а потім з допомогою оператора «.» отримується доступ до члена об'єкту, змінної або функції.

Cat Litter[5];

int i;

for (i = 0; i<5; i++)

Litter[i].SetAge(2*i+1);

Цикл встановлює вік кожного об’єкту типу Cat в масиві на 5 елементів.

Масиви вказівників

В динамічній пам'яті оголошуються об'єкти певного класу, вказівники на які заносяться в масив. Це дозволяє зменшити об'єм стекової пам'яті

Cat *Family[500];

int i;

Cat *pCat;

for (i=0; i<500; i++){

pCat = new Cat;

pCat->SetAge(2*i+1);

Family[i]=pCat;

}

Масив Family включає 500 вказівників на об’єкти типу Cat. В циклі в динаміній пам’яті ствоюється 500 об’єктів, адреси яких записуються в масив Family. Паралельно встановлюється вік.

Оголошення масивів в динамічній пам'яті.

Відбувається з допомого оператора new, результатом якого є вказівник на ДП(динамічну пам’ять), де розміщений масив. Вказівник Family вказує на перший об’єкт з масиву з 500 елементів.Таке оголошення довзвояє проводити арифметичні операції над вкзівниками для доступу до кожного елемента масиву.

Cat *Family = new Cat[500];

Cat *pCat = Family;

pCat->SetAge(10);

pCat++;

SetAge(20);

Вік 10 присвоєно нульовому об’єкту, вік 20 – першому об’єкту.

Наши рекомендации