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

Void main(void)

{

array numbers(100); // масив зі 100 елементів

int i;

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

numbers.add_value(i);

numbers.show_array( );

cout << "Сума чисел рівна " << numbers.sum( ) << endl;

cout << "Середнє значення рівне " << numbers.average_value( )

<< endl;

}

Як бачите, програма оголошує масив 100 елементів, а потім заносить в масив 50 значень за допомогою методу(функції) add_value. У класі array змінна index відстежує кількість елементів, збережених у даний момент в масиві. Якщо користувач спробує додати більше елементів, ніж може вмістити масив, функція add_value повертає помилку. Як бачите, функція average_value використовує змінну index для визначення середнього значення масиву. Програма запрошує пам'ять для масиву, використовуючи оператор new, який детально розглядається в уроці 32.

У багатьох випадках класи можуть відрізнятися лише типами. Інакше кажучи, один клас працює з цілочисельними значеннями, тоді як потрібний вам повинен працювати зі значеннями типу float. Щоб мати можливість повторного застосування існуючої програми, C++ дозволяє використовувати шаблони класів. Якщо сформулювати коротко, то шаблон класу визначає типонезалежний клас, який надалі служить для створення об'єктів необхідних типів. Якщо компілятор C++ зустрічає оголошення об'єкту, засноване на шаблоні класу, то для побудови класу необхідного типу він використовуватиме типи, вказані при оголошенні. Дозволяючи швидко створювати класи, які відрізняються лише типом, шаблони класів скорочують об'єм програмування, що, у свою чергу, економить ваш час.

Припустимо, що вашій програмі необхідно працювати з масивом значень з плаваючою крапкою, крім того, вона працює з цілочисельним масивом. Один із способів забезпечити підтримку масивів різних типів полягає в створенні різних класів. З іншого боку, використовуючи шаблони класів, ви можете позбутися необхідності дублювати класи. Нижче представлений шаблон класу, який створює загальний клас array:

template<class T, class Tl>

class array {

public:

array(int size);

Tl sum(void);

T average_value(void);

void show_array(void);

int add_value(T);

private:

T *data;

int size;

int index;

};

Цей шаблон визначає символи типів T i T1. У разі масиву цілочисельних значень Т відповідатиме int, а T1 - long. Аналогічним чином для масиву значень з плаваючою крапкою значення Т і Т1 будуть float типу.

Потім, перед кожною функцією класу ви повинні вказати шаблон зі словом template. Крім того, зразу ж після імені класу ви повинні вказати типи класу, наприклад array<T, T1>::average_value. Наступна частина програми ілюструє оголошення функції average_value для цього класу:

template<class T, class T1>

Т array<T, Tl>::average_value(void)

{

T1 sum = 0;

int i;

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

sum += data[i];

return(sum / index);

}

Після створення шаблона ви можете створювати клас необхідного типу, вказуючи ім'я класу, а за ним у кутових дужках необхідні типи, як показано нижче:

array<int, long> numbers (100);

array<float, float> values (200);

Програма GENARRAY.CPP використовує шаблон класу array для створення двох класів, один з яких працює зі значеннями типу int, а другий – типу float:

template<class T, class Tl>

class array {

public:

array(int size);

T1 sum(void);

T average_value(void);

void show_array(void);

int add_value(T);

private:

T *data;

int size;

int index;

};

template<class T, class T1>

array<Т, Т1>::array(int size)

{

data = new T[size];

if (data == NULL)

{

cout << "недостатньо пам'яті - програма завершується"

<< endl;

exit(i);

}

array::size = size;

array::index = 0;

}

template<class T, class T1>

T1 array<T, T1>::sum(void)

{

T1 sum = 0;

for (int i = 0; i < index; i++)

sum += data[i];

return(sum);

}

template<class T, class T1>

T array<T, T1>::average_value(void)

{

T1 sum = 0;

for (int i = 0; i < index; i++)

sum += data[i];

return(sum / index);

}

template<class T, class T1>

void array<T, T1>::show_array(void)

{

for (int i = 0; i < index; i++)

cout << data[i] << ' ';

cout << endl;

}

template<class T, class T1>

int array<T, T1>::add_value(T value)

{

if (index == size)

return(-1); // Масив повний

else

{

data [index] = value;

index++;

return(0); / / Успішно

}

}