Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

namespace Graph_lib {

struct Color { /* ... */ };

struct Shape { /* ... */ };

struct Line: Shape { /* ... */ };

struct Function: Shape { /* ... */ };

struct Text: Shape { /* ... */ };

// ...

int gui_main { /* ... */ }

}

Очень вероятно, что вы также захотите использовать эти имена, но теперь это уже не имеет значения. Вы можете определить сущность с именем

Text
, но ее уже невозможно перепутать с нашим классом,
имеющим то же имя. Наш класс называется
Graph_lib::Text
, а ваш класс — просто
Text
. Проблема возникнет только в том случае, если в вашей программе есть класс или пространство имен
Graph_lib
, в которое входит класс
Text
. Имя
Graph_lib
довольно неудачное; мы выбрали его потому, что “прекрасное и очевидное” имя
Graphics
имеет больше шансов встретиться где-нибудь еще.

Допустим, ваш класс

Text
является частью библиотеки для обработки текстов. Та же логика, которая заставила нас разместить графические средства в пространстве имен
Graph_lib
, подсказывает, что средства для обработки текстов следует поместить в пространстве имен, скажем, с именем
TextLib
.

namespace TextLib {

class Text { /* ... */ };

class Glyph { /* ... */ };

class Line { /* ... */ };

// ...

}

Если бы мы использовали оба пространства имен одновременно, то столкнулись бы с реальной проблемой. В этом случае действительно возникла бы коллизия между именами классов

Text
и
Line
. И что еще хуже, если бы мы были не создателями, а пользователями библиотеки, то не никак не смогли бы изменить эти имена и решить проблему. Использование пространств имен позволяет избежать проблем; иначе говоря, наш класс
Text
— это класс
Graph_lib::Text
, а ваш —
TextLib::Text
. Имя, составленное из имени пространства имен (или имени класса) и имени члена с помощью двух двоеточий,
::
, называют полностью определенным именем (fully qualified name).

8.7.1. Объявления using и директивы using

Писать полностью определенные имена довольно утомительно. Например, средства стандартной библиотеки языка С++ определены в пространстве имен

std
и могут использоваться примерно так:

#include<string> // доступ к библиотеке string

#include<iostream> // доступ к библиотеке iostream

int main

{

std::string name;

std::cout << " Пожалуйста, введите имя \n";

std::cin >> name;

std::cout << " Привет, " << name << '\n';

}

Тысячи раз обращаясь к элементам стандартной библиотеки

string
и
cout
, мы на самом деле вовсе не хотим каждый раз указывать их полностью определенные имена —
std::string
и
std::cout
. Напрашивается решение: один раз и навсегда указать, что под классом
string
мы имеем в виду класс
std::string
, а под потоком
cout
— поток
std::cout
и т.д.

using std::string; // string означает std::string

using std::cout; // cout означает std::cout

// ...

Эта конструкция называется объявлением

using
.
Она эквивалентна обращению “Грэг”, которое относится к Грэгу Хансену при условии, что никаких других Грэгов в комнате нет.

Иногда мы предпочитаем ссылаться на пространство имен еще “короче”: “Если вы не видите объявления имени в области видимости, ищите в пространстве имен std”. Для того чтобы сделать это, используется директива

using
.

using namespace std; // открывает доступ к именам из пространства std

Эта конструкция стала общепринятой.

#include<string> // доступ к библиотеке string

#include<iostream> // доступ к библиотеке iostream

using namespace std; // открывает доступ к именам из пространства std

int main

{

string name;

cout << "Пожалуйста, введите имя \n";

cin >> name;

cout << "Привет, " << name << '\n';

}

Здесь поток

cin
— это поток
std::cin
, класс
string
это класс
std::string
и т.д. Поскольку мы используем заголовочный файл
std_lib_facilities.h
, не стоит беспокоиться о стандартных заголовках и пространстве имен
std
. Мы рекомендуем избегать использования директивы using для любых пространств имен, за исключением тех из них, которые широко известны в конкретной области приложения, например пространства имен
std
. Проблема, связанная с чрезмерным использованием директивы
using
, заключается в том, что мы теряем след имен и рискуем создать коллизию. Явная квалификация с помощью соответствующих имен пространств имен и объявлений
using
не решает эту проблему. Итак, размещение директивы
using
в заголовочный файл (куда пользователю нет доступа) — плохая привычка. Однако, для того чтобы упростить первоначальный код, мы разместили директиву using для пространства имен
std
в заголовочном файле
std_lib_facilities.h
. Это позволило нам написать следующий код:

#include "std_lib_facilities.h"

int main

{

string name;

cout << "Пожалуйста, введите имя \n";

cin >> name;

cout << "Привет, " << name << '\n';

}

Мы обещаем больше никогда так не делать, если речь не идет о пространстве имен

std
.

Задание

• Создайте три файла:

my.h
,
my.cpp
и
use.cpp
. Заголовочный файл
my.h
содержит следующий код:

extern int foo;

void print_foo;

void print(int);

Исходный файл

my.cpp
содержит директивы
#include
для вставки файлов
my.h
и
std_lib_facilities.h
, определение функции
print_foo
для вывода значения переменной
foo
в поток
cout
и определение функции
print(int i)
для вывода в поток
cout
значения переменной
i
.

Поделиться:
Популярные книги

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников

Законы рода

Flow Ascold
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Законы рода

«Три звезды» миллиардера. Отель для новобрачных

Тоцка Тала
2. Три звезды
Любовные романы:
современные любовные романы
7.50
рейтинг книги
«Три звезды» миллиардера. Отель для новобрачных

Мимик нового Мира 13

Северный Лис
12. Мимик!
Фантастика:
боевая фантастика
юмористическая фантастика
рпг
5.00
рейтинг книги
Мимик нового Мира 13

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Не грози Дубровскому! Том 11

Панарин Антон
11. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том 11

Наваждение генерала драконов

Лунёва Мария
3. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Наваждение генерала драконов

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Золушка по имени Грейс

Ром Полина
Фантастика:
фэнтези
8.63
рейтинг книги
Золушка по имени Грейс