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;