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

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

05.05.2015, 14:15. Показов 8385. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.10.2015, 12:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от RAFA91 Посмотреть сообщение
так только тогда ?
Ага. Ну или можно сделать сокрытие данных на уровне файла (внутренее связывание у переменной и не выносить ее в h)
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
15.10.2015, 12:34  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
сокрытие данных на уровне файла
применить анонимное пространство ?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.10.2015, 12:38
Цитата Сообщение от RAFA91 Посмотреть сообщение
применить анонимное пространство ?
Ну да. Внутри какого-то cpp. Тогда из других файлов эту переменную никто не увидит и воспользоваться не сможет.
2
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
15.10.2015, 14:42  [ТС]
Не могу вспомнить как в одном файле использовать пространство , которое лежит в другом

к примеру в одном файле лежит

C++
1
2
3
4
5
6
7
8
9
10
11
//1.cpp
 
 namespace B
{
    class K 
    {
    public:
        int x;
        K(int a) : x(a) {}
    };
}
как его использовать в файле main.cpp ?



C++
1
2
3
4
5
6
//main.cpp
int main()
{
    B::K *b = new B::K(90);
    return 0;
}
Добавлено через 14 минут
с #include "1.h" работало

а с #include "1.cpp" нет
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.10.2015, 15:04
Цитата Сообщение от RAFA91 Посмотреть сообщение
Не могу вспомнить как в одном файле использовать пространство , которое лежит в другом
В таком виде никак. Объявления должны быть доступны, чтобы их можно было использовать.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
15.10.2015, 15:12  [ТС]
только подключив файл с расширением h можно использовать пространство в данном случае ?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.10.2015, 15:23
Цитата Сообщение от RAFA91 Посмотреть сообщение
только подключив файл с расширением h можно использовать пространство в данном случае ?
Технически, можно просто скопировать определение в другой файл и ничего не подключать - главное, чтобы оно было. Но это неудобно и ошибкоопасно, поэтому лучше эту работу возложить на препроцессор и вынести в h.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
10.11.2015, 18:36  [ТС]
Добрый день !
Хотел уточнить у знающих людей .
Скажите пожалуйста:
запись
C++
1
using namespace Rafa::Sava;
открывает оба пространства имен, или только Sava ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <iostream>
using namespace std;
 
namespace Rafa 
{
class A
{
public:
    A() {cout<<"constructor A"<<endl;}
};
namespace Sava
{
    class B
{
public:
    B() {cout<<"constructor B"<<endl;}
};
}
}
//using namespace Rafa;
using namespace Rafa::Sava;
 
int _tmain(int argc, _TCHAR* argv[])
{
    A k;          //ошибка
    B a;
    return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2015, 18:57
Цитата Сообщение от RAFA91 Посмотреть сообщение
открывает оба пространства имен, или только Sava ?
У тебя же самого код написан который должен дать тебе ответ на вопрос.
3
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
11.11.2015, 15:38  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
У тебя же самого код написан который должен дать тебе ответ на вопрос.
я не такой уж грамотный в этом вопросе поэтому мне нужно мнение экспертов.

по началу думал что
C++
1
using namespace Rafa::Sava;
открывает оба пространства.

теперь что-то сомневаюсь.

выходит

C++
1
2
using namespace Rafa;
using namespace Sava;
и

C++
1
using namespace Rafa::Sava;
это не одно и то же ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.11.2015, 17:59
Цитата Сообщение от RAFA91 Посмотреть сообщение
это не одно и то же ?
Конечно нет. Воспринимай структуру вложенных namespace как файловую систему.
Корень - глобальное пространство имен (можно не указывать, или указывается явно через ::)
Rafa содержит в себе Sava, т.е. чтобы получить из корня имена в Sava нужно добавить Rafa::Sava::.
Если ты уже находишься внутри Rafa, то для доступа к Sava достаточно добавить Sava::. И т.д.

Не по теме:

P.S. Рафа, Сава, Ахалай, Махалай.

2
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
11.11.2015, 18:05  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
глобальное пространство имен
Вы про это ?

C++
1
2
3
4
namespace 
{
   /////////////////
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.11.2015, 18:20
C++
1
namespace { }
Это безымянное пространство имен.
Для глобального же никакие namespace не указываются.
Например функция main должна быть в глобальном пространстве имен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
int i = 1; // глобальное пространство имен
 
namespace { // безымянное пространство имен
   int i = 2; 
   int& I = i;
};
 
namespace N { // пространство имен N
   int i = 3;
}
 
int main() {
    std::cout << ::i << std::endl; // 1
//    std::cout << i << std::endl; // неоднозначность
    std::cout << I << std::endl; // 2
    std::cout << N::i << std::endl; // 3
}
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
12.11.2015, 16:29  [ТС]
немножко поколдовал и заметил такую штуку.
в пространстве С можно просматривать x внешних пространств , а из внешних пространств внутренние пространства .
это правильно что присутствует двухсторонняя связь ?
также пространство поддерживает запись
C++
1
void func() ;

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace A
{
  int x=45;
        namespace B
    {
             int x=67;
             namespace С
             {
               int x=34;
               void func() 
               {
                  cout <<"C::x = "<<x<<endl;
                  cout <<"B::x = "<<B::x<<endl;
                  cout <<"A::x = "<<A::x<<endl;
               }
             }
        
    }
    
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.11.2015, 17:06
Цитата Сообщение от RAFA91 Посмотреть сообщение
это правильно что присутствует двухсторонняя связь ?
Тебя такой расклад чем-то не устраивает?
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
12.11.2015, 18:03  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Тебя такой расклад чем-то не устраивает?
противоречие инкапсуляции.

кстати можно ли вынести реализацию функции за пространство ? ну типо как в классе мы выносим методы в отельный cpp.?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
12.11.2015, 18:06
Цитата Сообщение от RAFA91 Посмотреть сообщение
это не одно и то же ?
using namespace Rafa::Sava подключает одно пространство имён.
C++
1
2
using namespace Rafa;
using namespace Sava;
подключает два по очереди, ЕМНИП. (Если всё же изменяет, пусть меня поправят)
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.11.2015, 18:10
Цитата Сообщение от RAFA91 Посмотреть сообщение
противоречие инкапсуляции.
Инкапсуляция для классов. Пространства имен расширяемы. Ты можешь добавить новую сущность в существующее пространство имен. Если где-то уже есть и используется namespace N, ты можешь совершенно свободно добавить нечто в это же пространство имен, редактируя при этом свой собственный файл и не трогая существующий.

Цитата Сообщение от RAFA91 Посмотреть сообщение
можно ли
Такие вопросы легко проверить эмпирическим путем.
Кликните здесь для просмотра всего текста
Да. Можно
2
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
12.11.2015, 19:05
Цитата Сообщение от RAFA91 Посмотреть сообщение
противоречие инкапсуляции.
как связаны пространства имен и инкапсусляция?
using namespace std
основной тезис
Цитата Сообщение от Croessmah Посмотреть сообщение
пространства имен можно рассматривать как уточнение имени сущности.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
13.11.2015, 15:04  [ТС]
Подскажите пожалуйста как лучше сделать.

1. пространство имен со своими функциями положить в h
2. функции вынести за пределы пространства и положить в cpp, а в h оставить только объявлении функций.

как тут

C++
1
2
3
4
5
6
7
8
9
 //1.h
namespace A
{
    void func_1();
    namespace B
    {
        void func_2();
    }
}
C++
1
2
3
4
5
6
7
8
9
//1.cpp
#include "stdafx.h"
#include "1.h"
#include <iostream>
 
using namespace std;
 
void A::func_1() {cout<<"))))))))))) A"<<endl; B::func_2();}
void A::B::func_2() {cout<<"))))))))))) B"<<endl;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2015, 15:04

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru