Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Создание пространства имен

05.05.2015, 14:15. Показов 8316. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток !!!

Не могу понять назначение создания пространств имен.

В книге автор привел следующий код программы.

Помогите пожалуйста разобраться в эго назначении .

Что автор этим хотел сказать ?

 Комментарий модератора 

Запрещено размещать задания и решения в виде картинок и других файлов с их текстом.
Миниатюры
Создание пространства имен  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2015, 14:15
Ответы с готовыми решениями:

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Пространства имён с++
Может я отсталый совсем, но перечислите пожалуйста все известные вам пространства имён в с++

Пространства имен в Эклипс
Добрый день. Переношу свой проект из IAR на Eclipse+Yagarto(gcc 4.6.2) Подскажите, из-за чего в hpp модулях проекта может не...

60
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 15:10
Студворк — интернет-сервис помощи студентам
RAFA91, наличие пространства имен никак не влияет на разделение кода по cpp/h файлам.
В хедере будет как в твоем примере. А в цэпэпэшнике так:
C++
1
2
3
4
5
6
7
8
namespace A
{
    void func_1() { /*body1*/ }
    namespace B
    {
        void func_2()  { /*body2*/ }
    }
}
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 15:17  [ТС]
Tulosba да то все понятно что суть не изменится.

так как лучше поступить ?

разделить по cpp и h или все загнать в h ? или может в самом h вынести реализацию функций за пространство ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 15:29
Цитата Сообщение от RAFA91 Посмотреть сообщение
так как лучше поступить ?
Основываясь на ODR, надо реализацию выносить в cpp для нешаблонных и не inline функций.
Но, повторюсь ещё раз, это никоим образом не зависит от наличия/отсутствия пространства имен.
Цитата Сообщение от RAFA91 Посмотреть сообщение
вынести реализацию функций за пространство
Стили разные бывают. Хочешь выносить - выноси.
Если функций мало, то можно и так:
C++
1
void N::f() { }
А если много, то проще так (чтобы не писать каждый раз N::):
C++
1
2
3
namespace N {
    void f() {}
}
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 15:40  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
А если много, то проще так (чтобы не писать каждый раз N::
ну так если и даже я вынесу реализацию за пространство , то всеравно нужно указывать явно пространство при вызове функции
C++
1
using namespace s;
не ставим.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace s
{
    void func();
}
 
void s::func() {cout<<"44444444"<<endl;}
 
int _tmain(int argc, _TCHAR* argv[])
{
    s::func();
    
    return 0;
}.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 15:44
Цитата Сообщение от RAFA91 Посмотреть сообщение
то всеравно нужно указывать явно пространство при вызове функции
А как иначе-то? Если разделяешь по пространствам имен, то при использовании так или иначе это пространство надо указать. Иначе была бы неоднозначность.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 15:48  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Иначе была бы неоднозначность.
Вы это имеете ввиду ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int x=34;
 
namespace s
{
    int x=45;
}
 
using namespace s;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"x = "<<x<<endl;
    
    return 0;
}.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 15:50
Цитата Сообщение от RAFA91 Посмотреть сообщение
Вы это имеете ввиду ?
Другое:
C++
1
2
3
4
5
namespace A { int x=1; }
namespace B { int x=2; }
int main() {
   cout << x << endl; // так нельзя
}
но, если я тебя правильно понял, ты хочешь именно такого.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 15:57  [ТС]
ну тут понятное дело будет ошибка даже если открыть оба пространства.

мне просто хотелось уточнить по поводу выноса реализации функций за пространство.

я думал что если мы выносим реализации функций за пространство, то явно указывать пространство не нужно при ее вызове.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 16:00
Цитата Сообщение от RAFA91 Посмотреть сообщение
если мы выносим реализации функций за пространство, то явно указывать пространство не нужно.
Их нельзя тогда будет различить при реализации.
C++
1
2
3
4
namespace A { void f(); }
namespace B { void f(); }
 
void f() { /* which one? */ }
Такая функция будет воспринята как функция в глобальном пространстве.
2
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 17:35  [ТС]
ради интереса хотел уточнить такую штуку. пока не проверял.

можно ли в классе использовать перечисление к примеру такое

C++
1
enum day{Monday=1,Tuesday,Wednesday,Thursday,Friday};
или только обьект этого перечисления?

C++
1
day a;
?

в пространство его положить свободно можно

C++
1
2
3
4
namespace k
{
    enum day{Monday=1,Tuesday,Wednesday,Thursday,Friday};
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 17:37
Цитата Сообщение от RAFA91 Посмотреть сообщение
можно ли в классе использовать перечисление к примеру такое
Можно. Это просто будет вложенный enum тип.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 17:45  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно. Это просто будет вложенный enum тип.
я могу его использовать только внутри класса ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 17:59
RAFA91, зависит от того в какой секции объявишь: public, private, protected
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 18:27  [ТС]
как я понял

C++
1
2
3
4
5
6
class K
{
public:
    enum day{Monday=1,Tuesday,Wednesday,Thursday,Friday};
    
};
это аналог

C++
1
2
3
4
5
6
namespace K
{
 
    enum day{Monday=1,Tuesday,Wednesday,Thursday,Friday};
    
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2015, 18:36
RAFA91, нет. В первом случае K - это классовый тип, во втором - пространство имён.
В первом случае можно создать объект класса K, во втором - нет.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 18:43  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
В первом случае можно создать объект класса
а что мешает сделать этот класс абстрактным ?

что если перед enum поставить слово статик ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2015, 18:47
Цитата Сообщение от RAFA91 Посмотреть сообщение
а что мешает сделать этот класс абстрактным ?
Он не перестанет быть классовым типом.

Цитата Сообщение от RAFA91 Посмотреть сообщение
что если перед enum поставить слово статик ?
Он не перестанет быть классовым типом.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2015, 18:49
Цитата Сообщение от RAFA91 Посмотреть сообщение
что если перед enum поставить слово статик ?
То оно не скомпилируется.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2015, 18:51
RAFA91, а тебе зачем все эти извращения? Почему бы не использовать class и namespace по назначению?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.11.2015, 19:07
Цитата Сообщение от RAFA91 Посмотреть сообщение
это аналог
верно.

с точки зрения правил языка с++ namespace и class - принципиально различные конструкции.

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

даже более того, если представить отношения пространств и классов в виде диаграммы UML,
то получаем любопытную картинку:

Code
1
2
3
4
5
6
7
            namespace
                  |
    --------------------------
    |                             |
structure<true>     structure<false>
    |                             |
 struct                       class
здесь мы видим,
что стуктуры и классы - инстансы одного и того же шаблона,
параметризованные разными стратегиями,
которые отвечают за модификаторы доступа

а этот шаблон наследуется от namespace,
наследуя все его примитивные свойства.


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

и позволяют объявлять в пространстве
своих имен различные сущности.

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

единственное, для классов действует стратегия управляющая доступом к его компонентам.
но так как в вашем случае модификатор доступа public,
то вы действительно получили аналог неймспейса.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2015, 19:07

Использование пространства имен
Добрый день! Вопрос такой: Для стандартной библиотеки обычно используется пространство имен std, которое подключается через...

Использование пространства имен
Написать программу, использующую описанные типы данных: инициализация переменных (ввод пользователя), выполнение действий (в зависимости от...

Использование пространства имен
Заголовочный файл с осн функциями двунаправленного списка.Нужно построить на его основе стек и очередь с обобщенным интерфейсом т.е...

Подключение пространства имён
Подскажите пошагово как в VS2010 создать dll, подключив такие .NET пространства имён как #using &lt;System.dll&gt; using namespace std;...

Область видимости, пространства имен
имею макрос #define max(a,b) (((a) &gt; (b)) ? (a) : (b)) он определен в Windows.h, который мне нужен в проекте... также мне нужна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru