Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 10:48   #1
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию Чем плох using

Пространства имён придуманы ради того, чтоб разрешить совпадать нескольким идентификаторам. А зачем это собственно надо? Пусть у вас есть свой строковый класс my::string, кроме него существует ещё std::string. Но если вам не нужен std::string, то в чём конфликт? Можно ведь не инкладить <string>. Вам нужен my::string и вы заинкладили <string> ради класса std::wstring? Ну скопируйте <string> в каталог проекта да почистите его. В чём собственно проблема? Класс string будет один. Много работы? Эйси, можно было с самого начала разделить std::string, std::wstring и std::u32string по разным файлам, пространство имён здесь не нужно. А зачем же оно нужно? Да за тем, чтоб использов
ать std::string и my::string одновременно.
Код:
#include <string>
namespace my
{
 ...
 class string
 {
  ...
 };
 ...
};
int main ()
{
 using namespace std;
 using namespace my;
 string s;// Здесь будет неопределённость имени string.
 ...
 return 0;
}
Проблема в том, что отменить действие using нельзя. При использовании оператора :: такой проблемы просто нет. В учебных поделухах на пару десятков строк, использующих кроме глобального ровно одно дополнительное пространство имён не страшно, но в них не страшно и namespace не поддерживать, обращаться к string, cout, cin и endl напрямую это ни как не помешает. А в тех больших проектах, где действительно нужны пространства имён, окажется, что using не решает своей задачи, так обращаться к членам пространств имён всё равно приходится через ::. Так зачем же лишняя строчка с using? Чтоб мешалась, другого назначения у неё в таких проектах нет.

Последний раз редактировалось taras-proger; 25.12.2015 в 10:56.
taras-proger вне форума Ответить с цитированием
Старый 25.12.2015, 11:43   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

1. что бы ЗНАТЬ какие пространства БУДУТ использованы (потребуются) без прочесывания.
2. чтобы разрешить использование этих имен std:: my:: (да-да это тоже имя и оно должно быть объявлено).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.12.2015, 11:52   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Эйси, можно было с самого начала разделить std::string, std::wstring и std::u32string по разным файлам, пространство имён здесь не нужно. А зачем же оно нужно? Да за тем, чтоб использов
ать std::string и my::string одновременно.
и подключать новый инклюд ради одной строчки почти? бред.

пространтства имен должны обеспечить независимость, и они это делают.(как ни странно)
не приходится писать TMyMegaString.
убирает префиксы классов.(см Делфи)
вообще в последнее время встречал что неплохо в using стоит пихать конкретные классы, а не все пространство.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.12.2015, 12:07   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Цитата:
Вам нужен my::string и вы заинкладили <string> ради класса std::wstring? Ну скопируйте <string> в каталог проекта да почистите его.
Если бы вы работали у меня, то вылетели бы сразу. + вы еще не в курсе, что юзинг может брать конкретные классы.
p51x вне форума Ответить с цитированием
Старый 25.12.2015, 12:11   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и подключать новый инклюд ради одной строчки почти? бред.
Ради одной строчки не нужен сам класс строк. Даже один, тем более два.
taras-proger вне форума Ответить с цитированием
Старый 25.12.2015, 12:14   #6
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1. что бы ЗНАТЬ какие пространства БУДУТ использованы (потребуются) без прочесывания.
Скорей уж не знать, так как эти юзены даже сам Страуструп раскидывает по всему тексту, а инклады хранятся компактно в начале. И какое дело кому то до использования целых пространств? Вот использование конкретных членов этих пространств - совсем другое дело. Но даже форма
Код:
using std::string
даёт не так уж много информации, так как факт использования строчного класса ещё мало о чём говорит, а знать надо, для чего используется каждый используемый член.
Цитата:
чтобы разрешить использование этих имен std:: my:: (да-да это тоже имя и оно должно быть объявлено).
Бред, эти имена сами лежат в глобале. А если кто то вложит одно пространство имён в другое, так можно ведь и два раза за одно обращение к члену применить орератор ::, например:
Код:
namespace my
{
 namespace string
 {
   class AnsiString
   {
    ...
   };
   class Utf16String
   {
    ...
   };
   class Utf32String
   {
    ...
   };
 };
 ...
};
int main()
{
 my::strimng::Utf32Strimng s;
 ...
 return 0;
}
. Юзин для этого не нужен.
Цитата:
пространства имен должны обеспечить независимость, и они это делают.
Они то это делают, да юзин независимость как раз недоотменяет. Зачем? Нафига сначала разводить идентификаторы по разным пространствам имён для независимости их имён, а потом сваливать эти имена снова в глобальное пространство имён для конфликта? Оператор :: то этот конфликт решит. Но зачем нужен юзин, если потом всё равно будет использован ::? Только чтоб мешаться.

Последний раз редактировалось taras-proger; 25.12.2015 в 12:41.
taras-proger вне форума Ответить с цитированием
Старый 25.12.2015, 12:39   #7
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Если бы вы работали у меня, то вылетели бы сразу. + вы еще не в курсе, что юзинг может брать конкретные классы.
В курсе. В отличие, видимо, от Вас. Каким образом юзин конкретного члена решит проблему, если сами пространства имён нужны именно за тем, чтоб одновременно использовать конкретные члены с совпадающими именами?
Код:
#inclde <string>
namespace my
{
 class string;
};
int main()
{
 using std::string;
 using my::string;// проблема перебралась со следующей строки на эту
 string s;
}.
Если бы стояла задача из std взять cout, а из my - string, то проблема решается проще: заинкладить iostream.h, но не искладить string.h и объявить свой string прямо в глобальном пространстве имён. И даже ради задачи одновременно использовать std::wstring и my::string можно было бы разделить файл string.h ещё на несколько. А вот чтоб использовать одновременно std::string и my::string другого решения нет. Но using ни как не поможет сказать, какой из них нужен в каждом случае, если в одних фигурных скобках нужны оба. А оператор :: даёт эту возможность. Причём, вне пространства std::string ни чем принципиально не отличается stdstring, но есть одно но: для членов самого пространства префикс std:: можно опускать, а префикс std остался бы обязателен даже там.

Последний раз редактировалось taras-proger; 25.12.2015 в 12:42.
taras-proger вне форума Ответить с цитированием
Старый 25.12.2015, 12:40   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а знать надо, для чего используется каждый используемый член.
а это надо знать и с юзингами и без.
Цитата:
Зачем? Нафига сначала разводить идентификаторы по разным пространствам имён для независимости их имён, а потом сваливать эти имена снова в глобальное пространство имён для конфликта? Оператор :: то этот конфликт решит. Но зачем нужен юзин, если потом всё равно будет использован ::? Только чтоб мешаться.
не нравится не юзайте, нашли проблему.
далее, может вас удивит но у using тоже есть область видимости.
а применяется он для сокращения кода.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.12.2015, 12:43   #9
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а это надо знать и с юзингами и без.
А я где то это отрицаю? Вот только юзины в этом не помогают.
taras-proger вне форума Ответить с цитированием
Старый 25.12.2015, 12:49   #10
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
далее, может вас удивит но у using тоже есть область видимости.
Тоже мне решение. Если члены разных пространств используются в разных частях программы, то их отлично можно разнести по модулям и не икладить в каждый всё подряд. Но ни какая область видимости юзина не поможет решить конфликт имён двух string из разных пространств, используемых в одних скобках, а только решение конфликта имён, используемых в одной и той же области видимости, и есть преимущество пространств имён перед другими подходами.
taras-proger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в чем ошибка? yana1213 Помощь студентам 1 15.05.2014 20:12
В чем ошибка!! deadh5n1 Помощь студентам 1 08.01.2012 21:13
Чем плох тег <center> ? Alar HTML и CSS 14 28.05.2010 16:28
В чем отличие С++ от С# valerij Свободное общение 14 10.03.2009 03:00
В чем ошибка? delphyok Паскаль, Turbo Pascal, PascalABC.NET 6 24.02.2009 23:33