Невеликий відступ: С + + та іменовані області видимості

Ми вже розглядали два способи роботи з іменованими областями (namespaces) в STL, проте вкрай важливо для вас зрозуміти наступне міркування У C + + namespace – щось подібне надкласу, який містить вкладені класи Наприклад, так ми створюємо надкласу з імям fred:

namespace fred

{

class A

{

}

class B

{

}

}

Код містить два підкласу, визначені як class A і class B Область namespace – це просто клас, в якому всі поля є загальними (public) Таким чином до класу A всередині fred можна звертатися як до fred :: A, а до класу B як fred :: B Чому це важливо Уявіть, що у вас в бібліотеці знаходиться клас, описаний таким чином (у даному випадку ми проігноруємо факт, що ваш менеджер не дав би вам називати класи просто A і B) Припустимо тепер, що вам потрібно підключити до проекту зовнішню (third-party) бібліотеку Ця зовнішня бібліотека поставляється без початкових кодів і містить в собі наступний опис:

namespace thirdpartylib

{

class A

{

}

class B

{

}

}

Очевидно, у вас зявляються проблеми Є два конфліктуючих класу A і два класи B, так що вам потрібно пройтися по всьому вашому вихідного коду і поміняти ці імена, а також змінити ці імена на нові в класах, які на них посилаються, не кажучи вже про функції, які з ними працюють Адже так Слава богу, немає У цих двох прикладах використовуються різні іменовані області (namespaces), так що, до Наприклад, для звернення до вашого класу A вам доведеться написати fred :: A Для звернення до класу A з зовнішньої бібліотеки потрібно використовувати вираз thirdpartylib :: A Ці два імені є різними з точки зору компілятора, так що все буде працювати так, як і замислювалося

Однак я чую глухий стогін, що виривається з ваших грудях Ви вирішили, що в коді класів A і

B вам постійно доведеться писати приблизно наступні страшні конструкції:

/ / Конструктор класу A в області fred fred :: A :: A (void)

{

}

Слава богу, такі речі писати необовязково Ви можете укласти заголовний і вихідний файл в одну і ту ж область (namespace) На заголовний файл ми вже дивилися, а от як виглядатиме вихідний файл (загалом-то, він нічим не відрізняється):

namespace fred

{

/ / Конструктор класу A в області fred A :: A (void)

{

}

}

Зауважте, що ви можете неодноразово відкривати і закривати блок namespace в одному і тому ж файлі Всі ці розрізнені шматки будуть поміщені разом в одну область Наприклад, якщо у вас два класи визначені в одному і тому ж вихідному файлі, але в різних областях namespace (навряд чи ви станете так робити, але теоретично у вас така можливість є), то ви можете написати:

namespace fred / / Відкриваємо область fred

{

/ / Код в області fred

} / / Закриваємо область fred

namespace george / / Відкриваємо область george

{

/ / Код в області george

} / / Закриваємо область george

/ / Ще який-небудь код

Є ще одна деталь щодо іменованих областей (namespaces) Якщо вам потрібно використовувати клас, певний в іншій області namespace, ви можете подумати що достатньо написати щось таке:

namespace fred

{

class george :: A / / Імпорт класу A з namespace george

class Foo

{

george::A aGeorgeA

}

}

На жаль, наведений вище код не спрацює Хоча в основному до областей namespace можна ставитися як до якоїсь надкласової структурі («надкласу»), насправді ці області такими не є В один і той же момент може бути відкрита тільки одна область, і не можна використовувати модифікатори namespace в посиланнях на ще не певні класи («посилання вперед») Як же вам впоратися з таким завданням Відповідь очевидна, якщо тільки вдуматися в проблему Ви закриваєте одну область namespace і відкриваєте іншу

namespace fred

{

/ / Внутрішні опису області fred

}

namespace george

{

class A / / Опис класу A,

/ / Який буде визначений далі

}

/ / Тепер ви можете написати

namespace fred

{

class A

{

george::A aGeorgeA

}

}

Наведений код компілюватиметься будь-яким стандартним компілятором ANSI C + + (до яких відноситься і CBuilder) і чудово працювати Все це приводить нас до наступної дискусії про те, що таке оператор using і чому його використовувати не потрібно

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*