Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
14
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

5.2.2.Визначення контейнерних класів

Стандартна техніка програмування в С++ заснована на використанні принципу підстановки при створенні контейнерного класу. Згідно цього принципу, змінній, оголошеної з певним типом, може бути привласнене значення підтипу. Тобто, варто створити список, елементами якого будуть екземпляри типу Object, і тільки при вийманні елемента зі списку потрібно буде застосувати операцію явного приведення типів. Однак варто враховувати, що С++ не підтримує підстановку для об'єктів. Підтримка даного принципу відбувається тільки для покажчиків і посилань. Із цієї причини контейнерні класи розробляються так, щоб зберігати покажчики на об'єкти, але не самі об'єкти.

Приклад побудови списку покажчиків загального виду void*:

class aList {

private:

listelem* firstelem; // початок списку (заголовок)

public:

alist () {firstelem = 0;} // 0 - порожній список

void addToList (void* newelem); // додавання в початок списку

void* first(); // витяг першого елемента

};

class listelem {

public:

void* value;

listelem* next; // зв'язаний елемент

};

void aList::addToList (void* newelem){

listelem* temp = new listelem; // створення нового елемента

temp > next = firstelem; // приєднання до списку

temp > value = newelem;

firstelem = temp; // модифікація заголовка списку

}

5.2.3.Стандартні контейнерні класи

Замість розробки власних контейнерних класів (списків, черг, масивів і т.д.) можна використати вбудовані класи С++, наприклад клас List. Даний клас є похідним від класу Container і являє собою сукупність об'єктів класу ListElement, що утворять односпрямований неупорядкований список. Всі операції по обробці списку виконують функції дружнього класу ListIterator, екземпляр якого ініціалізується методом класу ListInitIterator. Перебір починається з голови списку й триває до досягнення його останнього елемента. Значення в класі ListElement визначені як покажчики на клас Object.

Приклад програми побудови списку книг з використанням стандартного класу приводиться нижче.

#include <list.h>

void main (void){

List book_list; // створення екземпляра списку

while (1){

Book work; // створення робочого елемента класу Book

if (work.input_Book() = = END_INPUT) break;

booklist.add (*new Book(work));// створення екземпляра Book і

//додавання його в список

};

while (!book_list.isEmpty()){

Book& outbook = (Book&)book_list.peekHead(); // вибір першого

//елемента

book_list.detach(out_book,1); // видаляється елемент out_book,

//якщо параметр 0; елемент руйнується

};

}

При опису похідних класів від Object, наприклад,

class Book: public Object {...………};

необхідно визначити всі чисті віртуальні функції класу Object:

  • virtual classType is() - повертає інформацію про клас, до якого належить об'єкт, може бути константою;

  • virtual char* nameOf()– повертає рядок з ім'ям класу;

  • virtual HashValueType hashValue() – повертає унікальний ключ, пов'язаний з об'єктом, звичайно повертає 0;

  • virtual int isEqual(const Object) – порівняння об'єктів, повертає 1;

  • virtual void printOn() – виведення змісту полів об'єкта в зручному форматі.

5.3.STL – стандартна бібліотека шаблонів

Дана бібліотека була створена під керівництвом А. Степанова й Менга Чи. Поштовхом до її створення послужила робота з мовою Ada. STL (Standard Template Library) містить класи для векторів, списків, множин, словників, стеків, черг і черг із пріоритетом, тобто контейнерні класи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]