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

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

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

#include <list>

namespace hardware {

 class Device {

// ...

 };

 class DeviceMgr {

// ...

 };

}

#endif // DEVICES_H__

Этот механизм прост: «оберните» все, что требуется поместить в пространство имен, в блок

namespace
.

Приведенный

выше фрагмент — это объявление
Device
и
DeviceMgr
, но нам также требуется подумать об их реализациях, которые находятся в файле Devices.cpp. И снова оберните все в блок
namespace
— он будет добавлен к уже имеющемуся содержимому этого пространства имен.

#include "Devices.h"

#include <string>

#include <list>

namespace hardware {

 using std::string;

 using std::list;

 // Реализация Device и DeviceMgr

}

В данный момент пространство имен

hardware
содержит все, что требуется. Все, что осталось, — это где-то его использовать. Для этого имеется несколько способов. Способ, который был использован в примере 2.5, состоит в указании полного имени класса
Device
, включая пространство имен, как здесь.

#ifndef DEVICEWIDGET_H_

#define DEVICEWIDGET_H_

#include "Devices.h"

namespace ui {

 class Widget { /* ... */ };

 class DeviceWidget : public Widget {

 public:

DeviceWidget(const hardware::Device& dev) : device_(dev) {}

// Other stuff...

 protected:

hardware::Device device_;

 };

}

#endif // DEVICEWIDGET_H__

Также я использую этот способ в

main
в main.cpp.

int main {

 hardware::Device d;

 ui::DeviceWidget myWidget(d);

}

Чтобы добавить к одному из пространств имен типы, объявите заголовочный файл и файл реализации так, как показано в примере 2.5. При каждом использовании блока пространства имен, обрамляющего код, этот код добавляется в это пространство имен, так что в пространстве имен может находиться код, который ничего не знает о другом коде этого же пространства имен.

При использовании подхода с указанием полных имен классов, включающих пространство имен, вы быстро устанете вводить код. Имеется пара способов устранить эту проблему. Для полного имени типа с помощью ключевого слова

using
можно создать псевдоним.

using hardware::Device;

int main {

 Device d; // Пространство имен не требуется

 ui::DeviceWidget myWidget(d);

}

В

последующем коде вместо ввода полного имени можно просто сослаться на этот псевдоним. Или можно с помощью
using
импортировать все содержимое пространства имен, а не только один содержащийся в нем тип.

using namespace hardware;

int main {

 Device d:

 ui::DeviceWidget myWidget(d);

}

Этот вариант вы, вероятно, уже использовали, или, по крайней мере, видели в примерах, при использовании стандартной библиотеки (эту методику используют многие примеры в этой книге). Вся стандартная библиотека находится в пространстве имен

std
, так что очень часто вы увидите такое:

using namespace std;

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

std
только с целью повышения ясности кода и обычно рекомендуем не делать этого в реальных программах.

При импорте всего пространства имен или даже нескольких пространств имен их полезность значительно снижается. Одной из причин существования пространств имен является снижение конфликтов имен. При импорте нескольких различных пространств имен вероятность конфликтов имен увеличивается. В данный момент код может прекрасно компилироваться, но в будущем в одно из пространств имен может быть что-то добавлено, и при последующей сборке кода возникнет конфликт.

Чтобы разделить содержимое пространства имен на более мелкие группы, можно использовать вложенные пространства имен. Например, пространство имен

hardware
, определенное в примере 2.5, может на самом деле содержать большое количество сетевых классов и еще больше классов устройств, так что его можно было бы разделить, вложив еще несколько описательных имен.

namespace hardware {

 namespace net {

// сетевые классы

 }

 namespace devices {

// классы устройств

 }

}

Теперь доступ к элементам, содержащимся в пространстве имен, стал несколько более сложным.

// В каком-либо другом файле...

using hardware::devices::Device;

Пространства имен довольно удобны. Есть несколько интересных вещей, связанных с пространствами имен, облегчающих жизнь: псевдонимы пространств имен, автоматический поиск имен в пространствах имен параметров функций и подстановка имен перегрузок функций в объявлениях

using
. Последние два длинны по названиям, но просты.

Псевдоним пространства имен — это то, что означает его название: имя (возможно, короткое), которое используется для замены имени (возможно, длинного) пространства имен. Если вы не хотите использовать выражение

using
, но также не хотите вводить при каждом использовании класса огромное полное имя, создайте для него псевдоним.

using dev = hardware::devices;

// ...

dev::Device d;

Затем этот псевдоним используется при ссылке на элементы соответствующего пространства имен.

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

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Всадники бедствия

Мантикор Артемис
8. Покоривший СТЕНУ
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Всадники бедствия

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Империя ускоряется

Тамбовский Сергей
4. Империя у края
Фантастика:
альтернативная история
6.20
рейтинг книги
Империя ускоряется

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Новый Рал 2

Северный Лис
2. Рал!
Фантастика:
фэнтези
7.62
рейтинг книги
Новый Рал 2

Ведьма и Вожак

Суббота Светлана
Фантастика:
фэнтези
7.88
рейтинг книги
Ведьма и Вожак

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Возвращение Безумного Бога 2

Тесленок Кирилл Геннадьевич
2. Возвращение Безумного Бога
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 2

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3