
- •8.2.1. Реалізація класів
- •8.2.2. Породження об’єктів
- •8.2.3. Виклик операцій
- •8.2.4. Використання успадкування
- •8.2.5. Реалізація залежностей
- •8.2.6. Шаблони, шаблони-класи
- •Параметри шаблонів, що опускаються
- •Приклади, які використовують вектори символів
- •8.2.8. Основні компоненти stl
- •8.2.8.1. Контейнери
- •Контейнери послідовностей
- •Впорядковані асоціативні контейнери
- •8.2.8.2. Параметричні (родові) алгоритми
- •8.2.8.3. Ітератори
- •8.2.8.4. Об’єкти-функції
- •8.2.8.5. Адаптери
- •8.2.8.6. Алокатори
- •8.2.9. Stl та об’єктно-орієнтоване програмування
8.2.9. Stl та об’єктно-орієнтоване програмування
Може скластися враження, що бібліотека STL, яка мало використовує успадкування та зовсім не використовує віртуальних функцій, не має прямого стосунку до об’єктно-орієнтованого програмування. Це не так. По-перше, у бібліотеці STL систематично використовуються такі основоположні властивості об’єктно-орієнтованих систем програмування, як абстракція (інкапсуляція) даних і поліморфізм (перевантаження) методів та операцій. Крім того, систематично використовуючи шаблони та підтримуючи програмування з використання набору універсальних настроювальних, високоефективних, добре сконструйованих компонентів, STL суттєво полегшує складання, налагодження та модифікацію об’єктно-орієнтованих програм мовою С++. Нарешті, автори STL мають намір у наступних версіях бібліотеки ширше використовувати похідні класи та віртуальні функції, вважаючи, що це дозволить їм досягти таких удосконалень.
Розробити контейнери, які можуть зберігати об’єкти різних типів одночасно (неоднорідні контейнери).
Уникати «розбухання» коду за рахунок необхідності породження у програмах кількох однакових контейнерів: якщо у деякій програмі одночасно використовуються контейнери list<int>, list<string>, list<vector<int>> і т. ін., то у її EXE–файлі буде породжено кілька варіантів коду класу list, які не дуже розрізнятимуться між собою.
Розглянемо простий приклад програми, в якій компоненти STL використовують успадкування та віртуальні функції. У прикладі розглядається програма, яка малює на екрані геометричні об’єкти. Вона складається з таких компонентів:
управління екраном — програми та структури даних нижнього рівня, які забезпечують зображення на екрані точок і прямих ліній;
бібліотеки форм — набір певних геометричних форм (коми, прямокутники і т. ін.), а також стандартних програм для роботи з ними;
прикладної програми, яка вирішує поставлену задачу: виконує зображення «морди» та переміщення його по екрану.
#include <vector.h>
#include <algo.h>
#include <shape.h>
class myshape: public rectangle {
//Визначення нової форми – прямокутної «морди», похідної
//класу rectangle (береться з <shape.h>)
//
line* l_eye; //ліве око
line* r_eye; //праве око
line* mouth; //рот
public:
myshape (point, point);
void draw();
void move(int, int);
};
myshape:: myshape (point a, point b): rectangle(a,b)
{
int ll = neast().x – swest().x+1;
int hh = neast().y – swest().y+1;
l_eye = new line (point (swest().x+2,swest().y+hh*3/4),2);
r_eye = new line (point (swest().x+11-4, swest().y+hh*3/4),2);
mouth = new line (point (swest().x+2,swest().y+hh/4),11-4);
}
void myshape::draw()
//«морда» вимальовується як прямокутник з крапкою на місті
//«носа»; «очі» та «рот» вимальовуються окремо функцією
//shape_refresh.
{
rectangle::draw();
int a = (swest().x + neast().x)/2;
int b = (swest().y + neast().y)/2;
put_point(point(a,b));
};
void myshape::move (int a, int b)
//переміщення здійснюється шляхом переміщення базового
//прямокутника та вторинних об’єктів.
{
rectangle::move(a,b);
l_eye-> move(a,b);
r_eye-> move(a,b);
mouth-> move(a,b);
};
//починаються визначення, пов’язані з використанням STL.
struct CompWestX: binary_function<shape*, shape*,bool> {
bool operator()shape*p, shape*q)
//зрівнювання форм, починаючи з х-координат західного
//кінця. Функція west() є віртуальною в класі shape, так
//що результат зрівнювання залежить від того, як ця функція
//визначена для конкретної форми.
{
return p->west().x < q->west().x
}
} CompWestX;
void outputWestX(const vector<shape*>& vs)
//вивід х-координати західного кінця кожної форми vs.
{
vector<shape*>::const_iterator i;
for(i=vs.begin(); i!=vs.end(); ++i)
cout<<«х-координата західного кінця форми»
<<i — vs.begin()<<«існує»<<(*i-> west().x)<< end1;
};
//кінець визначень, пов’язаних з використанням STL.
int main()
{
//початок, взятий з книги Stroustrup по C++.
screen_init();
shape* p1 = new rectangle (point(0,0),point (10,10));
shape* p2 = new line(point (0,15),17)
shape* p3 = new myshape (point(15,10),point (27,18));
shape_refresh();
p3->move(-10,-10);
stack(p2,p3);
stack(p1,p2);
shape_refresh();
//Тут починається нова частина, в якій використовується
//STL. vector <shape*> vs;
vs.push_back(p1);
vs.push_back(p2);
vs.push_back(p3);
//горизонтальне переміщення 20 об’єктів за допомогою
//ітератора STL.
vector <shape*>::iterator i;
for(i=vs.begin(); i!=vs.end(); ++i)
(*(*i)).move (20,0);
shape_refresh();
//використання параметричного алгоритму упорядкування
//об’єктів outputWestX(vs);
cout<<упорядкування об’єктів за х-координатами із західного
<<кінця.<< end1;
sort(vs.begin(),vs.end(),compWestX);
cout<<після сортування<< end1;
outputWestX(vs);
screen_destroy();
}
Видача прикладу:
Спочатку видаються форми, які розміщуються в їх початкових позиціях:
*************
* *
* ** ** *
***************** *
* * *
* *
* ********* *
* *
*********** *************
* *
* *
* *
* *
* *
* *
* *
* *
* *
***********
Потім видані фігури зміщуються, утворюючи видачу:
***********
* *
* *
* *
* *
* *
* *
* *
* *
* *
***********
*****************
*************
* *
* ** ** *
* *
* * *
* *
* ********* *
* *
*************
Перемістивши ці фігури на 20 позицій по горизонталі, отримаємо:
***********
* *
* *
* *
* *
* *
* *
* *
* *
* *
***********
*****************
*************
* *
* ** ** *
* *
* * *
* *
* ********* *
* *
*************
Остання частина програми видає таку інформацію:
х-координата західного кінця форми 0 є 26
х-координата західного кінця форми 1 є 23
х-координата західного кінця форми 2 є 25
сортування об’єктів за х-координатами їх західного кінця
після сортування.
х-координата західного кінця форми 0 є 23
х-координата західного кінця форми 1 є 25
х-координата західного кінця форми 2 є 26