Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

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

05.05.2015, 14:15. Показов 8388. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru