Void main(). Об'єднання модулів в єдину програму здійснюється препроцесором по директиві включення:

{

List L;

L.add(5);

L.add(4);

L.insert(5,25);

L.insert(25,100);

L.print();

L.print_back();

L.remove(25);

L.print();

}

 

Об'єднання модулів в єдину програму здійснюється препроцесором по директиві включення:

 

#include им’я_файлу

 

Ім’я файлу задається або у вигляді "файл", або у вигляді <файл>. У першому варіанті передбачається, що модуль-файл повинен знаходитися в поточному каталозі – там же, де знаходиться файл main.cpp. Можна помістити файл, що підключається, в будь-який каталог, але тоді потрібно указувати його повне ім'я, наприклад

 

"c:\\Piter\\ch1\\List.cpp"

 

або

 

"с:/Chab/chl/List.срр"

 

Друга форма <файл> застосовується для включення стандартних бібліотечних файлів. Файл шукається препроцесором в стандартному каталозі інтегрованого середовища \include. У цей каталог можна поміщати і власні файли-модулі. Ім'я файлу потрібно указувати абсолютно точно. Пропуски усередині кутових дужок або усередині лапок – значущі, тому без необхідності додаткові пропуски писати не можна.

Імена стандартних файлів-заголовків рекомендується писати без розширення .h. Щоб попередити можливі конфлікти імен, заголовки бібліотек C слід починати з символу "с". У складі C++ є 32 системних файлів-заголовків:

 

<algorithm> <iomanip><list> <queue> <streambuf>

<bitset> <ios> <locale> <set> <string>

<complex> <iosfwd> <map> <sstream> <typeinfo>

<deque> <iostream><memory> <stack> <utility>

<exception> <istream> <new> <stdexcept> <valarray>

<fstream> <iterator> <numeric> <strstream> <vector>

<functional> <limits> <ostream>

 

та 18 стандартних файлів-заголовків, успадкованих від С:

 

<cassert> <siso646><csetjmp><cstdio> <ctime>

<cctype> <climits> <csignal> <cstdlib> <cwchar>

<cerrno> <clocale> <cstdarg><cstring> <cwctype>

<cfloat> <cmath> <cstddef>

 

9.3 Відділення інтерфейсу від реалізації

Зазвичай інтерфейс класу (який є його визначенням) відділяється від його реалізації. Інтерфейс класу і визначення статичних полів поміщаються у файл-заголовок ім’я_файлу.h (заголовок, "шапка" – від англійського header); "вартового" включення потрібно задати в заголовку. Реалізація методів класу виноситься в окремий файл ім’я_файлу.срр. До інших модулів, які використовують даний клас, підключається тільки заголовок; заголовок підключається і до файлу з реалізацією методів.

 

/*TClass.h, файл з інтерфейсом класу */

// необхідні системні заголовки

#ifndef _STRAG // "вартовий" визначений?

#define _STRAG // визначення "вартового"

 

class TClass

{ // поля та прототипи методів

};

#endif /*_STRAG */ // кінець ifndef

// визначення статичних полів

/* TClass.срр, файл с реалізацією класу */

// необхідні системні заголовки

#include "TClass.h"

// реалізація методів зовнішнім способом

 

У проект інтегрованого середовища включаються файл реалізації і файл з програмою-клієнтом. Файл-заголовок до складу проекту зазвичай не входить.

Розділення класу на інтерфейс і реалізацію не заважає спадкуванню. Клас- спадкоємець теж ділиться на інтерфейс-заголовок і реалізацію; заголовок базового класу підключається до заголовка класу-спадкоємця.

 

/* Base.h, файл з інтерфейсом базового класу */

// необхідні системні заголовки

#ifndef _STRAGBASE // "вартовий" визначений?

#define _STRAGBASE // визначення "вартового"

 

class Base

{ // поля та прототипи методів

};

#endif /* _STRAGBASE */ // кінець ifndef

// визначення статичних полів

/* Base.срр. файл з реалізацією базового класу */

// необхідні системні заголовки

#include "Base.h"

// реалізація методів зовнішнім способом

/* Derive.h, файл з інтерфейсом класу-спадкоємця */

// необхідні системні заголовки

#include "Base.h" // для спадкування!

#ifndef _STRAGDERIVE // "вартовий" визначений?

#define _STRAGDERIVE // визначення "вартового"

class Derive: public Base

{ // поля та прототипи методів

};

#endif /* STRAGDERIVE */ // кінець ifndef

// визначення статичних полів

/* Derive.срр. файл з реалізацією класу-спадкоємця */

// необхідні системні заголовки

#include "Derive.h"

// реалізація методів зовнішнім способом

 

У проект включаються файли реалізації базового класу, похідного і код програми-клієнта.

9.4 Шаблони та модульність. Простір імен

 

Шаблони не можна ділити на інтерфейс та реалізацію і транслювати окремо. Шаблон є тільки заготівкою для побудови коду: поки шаблон не інстанційований ("конкретизований конкретним типом"), об'єктний код з нього не транслюється – складальникові нічого робити. Модулі, що використовують шаблон повинні підключити файл з повним визначенням шаблону за допомогою #include. Такий спосіб організації коду з шаблонами називається моделлю включення.

Другий варіант організації коду з шаблонами – модель явного інстанціювання. Цей спосіб працює і для шаблонів функцій, і для шаблонів класів. В цьому випадку шаблони інстанціюються (тобто реалізуються, конкретизуються) за допомогою директиви явного інстанціювання.

Тут клас-шаблон, як і звичайний клас, ділиться на інтерфейс і реалізацію, і в проект включаються наступні файли:

– файл з визначенням інтерфейсу класу-шаблону;

– файл з реалізацією класу-шаблону;

– файл з директивами явного інстанціювання;

– файл з програмою-клієнтом.

Ділення програми на файли-модулі – це фізичне розділення програми на частини. Щоб розділити велику програму на логічно зв'язані частини, до C++ передбачені простори імен. У новому стандарті визначений стандартний простір імен std.

Простір імен може мати ім'я. Оголошення простору імен – це призначення імені для області, в якій будуть видні компоненти простору імен. Синтаксис іменованого оголошення виглядає так:

 

namespace ім'я

{ // оголошення і визначення

}

 

Ідентифікатор namespace є зарезервованим словом. Простір імен може містити оголошення і визначення змінних, функцій, класів, типів, шаблонів і так далі. Ці імена вважаються членами даного простору імен. Визначення мають бути в однині.

У простір імен можна включати і заголовні файли, наприклад:

 

namespace SPACE { #include "List.h" }

 

Доступ до елементів простору імен (у тій же одиниці трансляції, але поза ним, або в іншій одиниці трансляції) виконується за допомогою операції дозволу видимості (::). Ідентифікатор простору імен слугує кваліфікатором для імені компоненту:

 

<простір імен>::<ім’я компоненту>

 

Наприклад, імена із стандартного простору імен можна писати так:

 

std::cin

std::cerr

 

Щоб не супроводжувати імена кваліфікаторами, можна використовувати using-об’яви

 

using <простір імен>::<ім’я компоненту>

 

Слово using, так само як і namespace, є зарезервованим словом. Надалі оголошені імена можна використовувати в програмі без кваліфікатора. Для стандартних імен з простору std це виглядає так:

 

using std::cout;

using std::endl;

 

Можна оголосити доступним відразу весь простір імен за допомогою using-директиви

 

using namespace <простір імен>;

 

Надалі всі імена з вказаного простору імен можна писати без префікса. Ця директива діє до кінця одиниці трансляції. На інші файли її вплив не розповсюджується. Для використання будь-якого імені із стандартного простору імен std потрібно задати директиву

 

using namespace std;

 

Цю директиву можна писати всякий раз, коли у вас в програмі зустрічається включення стандартного заголовка із списку, вказаного в новому стандарті.

Будь-яку форму using можна використовувати усередині деякого простору імен з метою включення в нього імен з іншого простору. Не використовуйте глобальну директиву using в заголовних файлах!

У визначеннях членів імена з того ж простору імен дозволено використовувати без вказівки кваліфікатор – аналогічно тому, як в методах класу дозволено вживати будь-які імена з того ж класу без префікса.

Стандарт C++ дозволяє оголошувати синоніми імен (псевдоніми), наприклад:

 

namesрасе MFC = Microsoft_Foundation_Class;

 

Така декларація використовується для перевизначення довгих імен, придуманих розробниками бібліотек.

Простори імен можуть бути вкладеними, наприклад:

 

namespace External {// зовнішній простір імен

double a;

namespace Internal {// вкладений простір імен

void F() { а=7.2; }// працює External ::а

int a;

void G() { а++; } // працює Internal ::а;

}

}

 

Для звернення до імен з вкладеного простору слід вказувати подвійний префікс-кваліфікатор, наприклад:

 

External :: Internal ::F();

 

Псевдоніми можна призначати і для вкладених просторів імен, наприклад:

 

namespace Borland_Builder { // зовнішнє

/* члени зовнішнього namespace */

namespace Visual_Component_Library { // вкладене

/* члени внутрішнього namespace */

}

}

// Псевдоніми namespace

// Зовнішній простір

namespace ВВ = Borland_Builder;

// Внутрішній простір задається з кваліфікатором

namespace VCL=Borland_Builder::Visual_Component_Library;

 

 

9.5 Фізичне розділення простору імен

 

При фізичному розділенні програми на модулі простір імен розбивається на частини. Але якщо в різних одиницях трансляції оголошений один і той же простір імен, він "склеюється" в єдине ціле. Саме таким чином визначений стандартний простір імен std.

Ця властивість "склеювання" простору імен добре підходить для організації бібліотеки. Аналогічно класам, початковий код розділяється на дві частини: інтерфейс та реалізацію. Інтерфейсна частина поміщається в окремий заголовний файл, а реалізація – в інший файл. У клієнтському коді підключається тільки заголовний файл.

Приклад:

 

/* vector.h */








Дата добавления: 2014-12-26; просмотров: 981;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.034 сек.