- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
7.1.2. Шаблони класів
Створення шаблона функції має своєю метою відокремити алгоритм від конкретних типів даних, з якими функція працює. Тип даних передається на етапі компіляції як параметр функції. Аналогічний підхід може бути застосований і до класів. Для цього визначається шаблон класу, що може створювати сімейства родинних класів і застосовувати їх до декількох типів даних, передаючи тип як параметр. Синтаксис опису шаблона виглядає як
template <class Параметр_шаблона> class Ім'я_класу {
/*Члени_класу*/
};
У списку параметрів шаблона (у кутових дужках <...>) може бути кілька параметрів – тоді вони записуються через кому.
Приклад опису шаблона вектора (одновимірного масиву):
template <class T> class vector{
int i, num;
T *a;
public:
vector (int); //Конструктор
T find (int &); //Функція пошуку мінімального ел-та
void in();//Функція введення
void show();//Функція відображення
};
Методи (функції) шаблона автоматично є шаблонами функцій. Якщо метод описується поза шаблоном, треба дотримуватися синтаксису:
template <class Параметр_шаблона>
Тип_значення_що_повертається Ім'я_класу <Параметр_шаблона> :: Ім'я_функції (Список_параметрів_функції) {
/*Тіло_функції*/
}
7.1.3. Приклад. Методи шаблона вектора
Продовжимо розгляд шаблона класу вектора vector (див. попередній розділ) і визначимо методи, що фігурують в оголошенні цього класу. Конструктор класу-шаблона:
template <class T> vector <T> :: vector(int num){
a= new T[num];
vector :: num = num;
}
Функція введення значень елементів вектора:
template <class T> void vector <T> :: in() {
cout<<"Enter elements: ";
for (i=0; i<num; i++)
cin>>a[i];
}
Функція виведення елементів вектора на екран:
template <class T> void vector <T> :: show() {
for(i=0; i<num; i++)
cout<<a[i]<<" ";
cout<<endl;
}
Функція пошуку найменшого елемента; повертає значення цього елемента:
template <class T> T vector <T> :: find (int &min){
for (i=0; i<num; i++)
if (a[i]<a[min]) min=i;
return a[min];
}
Створення об'єкта-вектора (наприклад, цілочисельного масиву) і звертання до методів шаблона може виглядати так:
vector <int> arr (n);
arr.in();
arr.show();
int am = arr.find(min);
7.1.4. Приклад. Шаблон класу зв'язного списку
Параметрами шаблона можуть виступати не тільки стандартні типи даних, але й користувальницькі типи, наприклад, структура. Розглянемо приклад створення шаблона класу для списку (порівняйте з кодом у розд. "2.1.1. Списки"):
template <class T> class List {
T *pstart; //Покажчик початку списку
public:
List() { pstart=NULL; };
void add();
void display();
};
//Функція додавання вузла в список
template <class T> void List<T> :: add(){
T *temp; //Тимчасовий вузол
temp = new T;
cout << "Enter field1 : ";
cin >>temp->field1; //Введення значення в поле 1
cout << "Enter field2 : ";
cin >>temp->field2; //Введення значення в поле 2
temp->nxt = NULL; //Оскільки temp - останній вузол
//Зв'язування вузла із списком
if (pstart == NULL) pstart = temp;
else {
T *temp2; //Тимчасовий покажчик
temp2 = pstart; //Покажчик на початок списку
while (temp2->nxt != NULL) //Поки не кінець списку
temp2 = temp2->nxt;//перемістити покажчик
temp2->nxt = temp; //Прив'язати до списку новий вузол
}
}
//Функція відображення списку на екрані
template <class T> void List<T> :: display(){
T *temp;
temp = pstart;
cout << endl;
if (temp == NULL) //Якщо список порожній
cout << "The list is empty!" << endl;
else {
while (temp != NULL) {//Поки не кінець списку
cout << "field1 : " << temp->field1<< " ";
cout << "field2 : " << temp->field2<<endl;
temp = temp->nxt;
}
cout << "End of list!" << endl;
}
}
У цьому класі визначені функції додавання вузла в список (add) і відображення списку (display). Параметром шаблона T є тип даних вузла, наприклад, для списку "Блокнот" це може бути наступна структура:
struct node {
char field1[20];
long field2;
node *nxt;
};
Змінна field1 зберігає ім'я, а field2 – номер телефону. Тоді для створення об'єкта-списку потрібно записати:
List <node> mylist;
Якщо дані вузла містять не два (field1 і field2), а інше число полів, функції add і display потрібно видозмінити очевидним чином. Звернення до всіх полів структури як і раніше буде виконуватися через покажчик на вузол.