using namespace std и std:: надоело смотреть!
|
Наболело поэтому несколько эмоционально: Кто нибудь понимает зачем используют using namespace std; и как глупо для каждой стандартной функции STD писать std:: - нееет???Ну тогда вам сюда в дискуссию! Итак зачем вообще используют конструкцию using namespace std - ответ прост этим мы явно указываем компилятору что хотим использовать в своём коде функции из пространства имён STD Тогда у многих встаёт вопрос: что означает конструкция std:: это явное указание области видимости? Ответ тоже прост : при такой записи компилятор также обращается к объекту(чаще всего это функция) следующего за вторым двоеточием. Итак что при использовании using namespace что при использовании std::мы всего лишь даём понять компилятору к какой функции и из какого пространства имён обращаться. А теперь у меня вопрос к вам, читающим всё это - Что это за инкубатор с std::, кто-то когда то по видимому безрукий ляпнул : "да будет std::, так правильно" и всё - понеслась. Каждый пытается обезопасить себя от какого-то потенциально опасного перекрытия пространства имён и т.д, хотя никакой опасности нет вообще. Всем скептиками предлагаю код ниже
Вывод напрашивается сам собой - накой вообще везде лепить std:: если даже без явного указания области видимости ничего страшного не произойдёт даже при использовании другого namespace-а Код с двоеточиями, нечитабелен, абсолютно такой же по функционалу что и код без std::. И ещё один момент - кто нибудь в MSDN-е встречал код с std:: именно официальный код???Ну хорошо из 100 кодов возможно пара содержит std::, остальная же часть кода дана с using namespace std; как такая которая позволяет сокращать код (прелагаю посчитать на сколько символов увеличивает std:: в каждой строчке длинну кода). Таким образом конструкция using namespace std целесообразней в плане сокращения длинны кода, нежели std::. Все гипотетичекие проблеммы перекрёстного использования пространств имён с одинаковыми функциями надуманы и обусловлены кривостью чьих-то рук, либо неправильным их расположением(я о руках) не из того места. Добавлено мной 31.07.2012 Тема оказалась душетрепещущей - предлагаю для ускорения понимания перепрыгивать с 1-й страницы сюда https://www.cyberforum.ru/blog... omment3371 и сюда https://www.cyberforum.ru/blog... omment3378 Также привожу выжимку из Шильдта
| ||||||
-
Не по теме:
Также хочу отметить что ваш покорный ответчик привык к абстракциям совсем иного плана нежели using namespace и прочее (пишу под виндовс и создаю приложения с диалоговым интрфейсом там вот этих всех проблем нет верней они уже были решены заранее и обплетены надстройками более продвинутых классов и интерфейсов, так что спейсы просто отдыхают пожалуй...)
Запись от -=ЮрА=- размещена 28.07.2012 в 11:43
-
Теперь буду свои слова сопровождать нагляными примерами,
https://www.cyberforum.ru/cpp-... 29938.html
вот честно ложа руку на сердце скажем - сильно ли помогло человеку std:: в решении задачи, его код очень прозрачен???(напишу мысли с позиции новичка :"Оу щет, идёт куча двоеточей ХЗ зачем, я вот недавно прочёл что есть string вот тут пример с ним http://www.cplusplus.com/refer... g/replace/ но нигде нету двоеточий, зачем же они в коде???")
Автор темы пишет std:: потому что ему просто внушили что так лучше, отравили человеку мозг и даже не спросили его на то разрешение + даже альтернатив не показали, вобщем
мои посты идут с отсюда https://www.cyberforum.ru/cpp-... ost3308502
абстракция всего здесь http://codepad.org/DTcFk7zd
Как видим всё чистенько и хорошо работает без std:: так что не надо меня переубежадть - отчистите лучше свои мысли от навеянных тенденций (весьма и весьма глупых на мой взгляд)
Запись от -=ЮрА=- размещена 28.07.2012 в 15:30
-
1. вроде не "CDialog::SetWindowText", а "CWnd::SetWindowText", но не в этом суть. о каком временном объекте речь? я наверное вас просто не так понял. если вы устанавливаете текст заголовка окна, то объект окна очевидно должен существовать. я далек от мысли, что вы называете "CDialog::" временным объектом. сравнение вызовов "CWnd::SetWindowText" и "SetWindowText" некорректно. один вызов является методом класса, другой - функцией WinAPI которой, кстати, передается хэндл окна, что менее наглядно, менее читабельно и прыгает далеко в сторону от объектно-ориентированной методологии. в общем, я не понял о чем вы.
2. "если выов второго класса нужен в 2-х 3-х строка я не против ставьте спейс:: если больше, то никаких у вас обоснований нагромождать код двоеточечням хламом я не вижу!" - еще раз пробубню, что использование using, если оно допускается в проекте, должно регламентироваться каким-нибудь соглашением между разработчиками, наподобие "все стандартные функции используем с using без std::". если проект достаточно развит таких соглашений быть не может, так как функции разных пространств будут использоваться почти одинаково часто. поэтому конструкции "std::" универсальны и так широко распространены. поэтому действительно разумные книжки не злоупотребляют using. поэтому они учат людей так делать. а не потому, что все "глупые люди" так делают.
3. если у человека возникает текст "Оу щет, идёт куча двоеточей ХЗ зачем" ему не поможет using)) using этого человека просто разорвет) не сегодня. завтра)
4. не нужно на своих привычках основывать новую "религию". типовой подход к программированию в C++ основан на использовании конструкций вида "std::". вы просто не привыкли к "std::". это напоминает введение в язык конструкций #define begin { теми кто не привык к {Запись от vxg размещена 30.07.2012 в 09:59
-
vxg касательно 1-го пункта
часть afxwin.h
можете на досуге испробовать этот кодC++ 1 2
class CDialog : public CWnd {
C++ 1 2 3 4 5 6 7 8 9
void CWndTextDlg::OnOK() { // TODO: Add extra validation here CDialog::SetWindowText("TEST"); AfxMessageBox("Press OK"); CWndTextDlg::SetWindowText("Test"); AfxMessageBox("Press OK"); CDialog::OnOK(); }

Думаю должно быть видно что CWndTextDlg наследует базовый CDialog
и SetWindowText будет виртуальным методом в контексте CDialog. (Интересно что же для вас CDialog::SetWindowText как не временный объект?) Давайте MFC пока что отодвинем в сторону ведь суть в другом.C++ 1 2
class CWndTextDlg : public CDialog {
Касательно всего остально - могу сказать одно у вас чувствуется наличие знаний, однако шаблонных я бы сказал, которые тянут вас на дно, не давая посмотреть на мир беспристрастно. Отмечу, что на всех 8-ми страницах данной темы так и не нашёл достойного примера когда же using namespace уступает space:: кроме этого даже литературу здесь привёл https://www.cyberforum.ru/blog... omment3222 (а ведь на Шильда у нас здесь на форуме многие так сказать "молятся", почему бы и вам его словам не внять если мои не воспринимаются?)
Не по теме:
PS: Кстати можно парочку ссылок на "умные" в вашем понимании книги
С удовольствием посмотрю что за "светила" их написали:)Запись от -=ЮрА=- размещена 30.07.2012 в 13:26
-
касательно ответа на первый пункт - вы продолжаете меня удивлять. я наверное все таки вас не так понимаю. метод SetWindowText объявлен в классе CWnd. класс CDialog наследует этот метод от своего базового класса CWnd. на основе базового класса CDialog вы создаете (предположительно так как в MFC я не работаю) свой объект интерфейса с классом CWndTextDlg которому по наследству придет все тот же метод SetWindowText. если базовые классы не содержат методов с одинаковыми сигнатурами, то вызывать один из методов класса внутри другого метода того же класса используя квалифицированное имя (CDialog::SetWindowText) могут только, простите, дегенераты - все методы класса итак нормально воспринимаются внутри класса. CDialog::SetWindowTex (или, точнее, CDialog:: ) - это не временный объект. это вообще не объект. это вызов метода класса с помощью квалифицированного имени. префикс CDialog:: используется для указания области действия. это, еще раз, не объект.
----
ссылка не литературу которую вы привели содержит очевидные вещи. да, мы знаем что пространства имен есть. да, мы знаем что есть инструкция using. да, автор сказал нам что можно ей пользоваться. и что? вы то призываете нас придать анафеме конструкции вида std:: а это совсем другое. тем более что все это подается как философский камень тем людям которые еще не в силах отличить хорошее от лучшего.
----
поскольку вы спокойно препарируете под свои нужды труды любых "светил" сложно будет дать вам правильную ссылку. ну, не совсем то, но, например, вот))
http://google-styleguide.googl... Namespaces
///////
читать там где
You may not use a using-directive to make all names from a namespace available.
// Forbidden -- This pollutes the namespace.
using namespace foo;
///////
а вы тоже тогда покажите ссылку где говорится о том что using круто, а конструкции вида std:: - вредная графомания и сорная траваЗапись от vxg размещена 30.07.2012 в 16:30
-
- ты что издеваешся блин???
Я блин кому линк давал
- пустому месту??!
Вот тут прочти
http://khpi-iip.mipk.kharkiv.e... lava13.pdf
Касательно того что ты привел
Специально для людей с плохим знанием английского даю пояснение - написано
Ключевое слово ВЫ можете - а не ВЫ не должны - уловил?!
Притом строкой ниже идёт
- перевести сможешь или помочь?
Причём там речь шла о конструкциях типа using std::cout за которые я ещё сдесь написал https://www.cyberforum.ru/blog... omment1397. Касательно using space::fun вообще от тебя пошло пару страниц назад, я показал что и это можно обходить.
Мне немного поднадоел наш бессмысленный разговор, особенно об MFC, давай я не буду проделывать тебе ликбез по наследованию классов и виртуальным функциям, а то складывается впечатление что плаваешь в этом аспекте...
- ещё бы написал
- это вызов виртуальной функции, разберись в наследовании классов...Запись от -=ЮрА=- размещена 30.07.2012 в 17:16
-
Запись от grizlik78 размещена 30.07.2012 в 17:42
-
grizlik78 - я то как раз умею посмотри что значит глагол may - который означает мочь
И наверно я для слепых привёл нижний текст
Ладно пацаны вы тут написали много словес, среди которых особенно улыбнуло
На досуге советую пощупать этот код, чтобы хоть в MFC понимали что к чему
C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
void CWndTextDlg::OnOK() { // TODO: Add extra validation here CDialog::SetWindowText("TEST"); AfxMessageBox("Press OK"); CWndTextDlg::SetWindowText("Test"); AfxMessageBox("Press OK"); CDialog::OnOK(); } void CWndTextDlg::SetWindowText(LPCTSTR szTitle) { CString str = szTitle; str = "Virtual fun " + str; CDialog::SetWindowText(str); }

Запись от -=ЮрА=- размещена 30.07.2012 в 17:51
-
Запись от -=ЮрА=- размещена 30.07.2012 в 17:53
-
http://www.ab.com/linked/progr... /eula.html
Всё это делать нельзя. Но тебе, разумеется, можно.
Удачи.Запись от grizlik78 размещена 30.07.2012 в 20:12
-
Запись от -=ЮрА=- размещена 30.07.2012 в 22:03
-
а Юрок то прав. И знаете в чем? В том, что не надо доходить до маразма выполняя как робот то, что "кто то сказал вслух" и не осознав это. Я уже встречал надписи плана надо использовать классы потому что надо. Они полезны. Знаете, все должно быть к месту и по ситуации. И прежде чем, что либо использовать, а тем более поучать остальных, надо как минимум понимать о чем речь. К чему были цитаты с англоязычных источников - непонятно. Их вес равен нулю без приложения к конкретному опыту и ситуации. Сухая теория без практики - ничто.Запись от Pure размещена 30.07.2012 в 23:14
-
"Я блин кому линк давал" - уважаемый, в вашем линке, повторюсь, просто описывается, что такое пространства имен, вы сами читать умеете? где там написано, что "желательно пользоваться конструкциями using вместо префиксов указывающих пространство имен"?
----
"Ключевое слово ВЫ можете" - отодвиньте в сторону словарик, это как раз вам не нужно дословно переводить текст, вам показать сколько значений имеет это слово и вообще как оно вяжется с контекстом? в данном случае в связке с окружением я бы перевел его как "вам следует избегать использования/вам не следует использовать". специально для сомневающихся внизу дан пример с надписью красными буковками "Forbidden -- This pollutes the namespace" - запрещено - это засоряет пространство имен.
----
"Притом строкой ниже идёт" - внимательно читаем и вникаем в отличия между "You may not use a using-directive" и "You may use a using-declaration" - во втором случае речь идет о внесении в глобальное пространство имен конкретных компонентов некоторого пространства имен, в данном случае - подпространства имен bar.
----
касательно вашего понимания объектно-ориентированного программирования - я понял, извините за каламбур, что я вас правильно понял: вы просто не понимаете, что такое классы. я был большего мнения об отметке "адванс" под вашим ником. если вам не знаком термин квалифицированное имя можете называть это указанием области действия или, как вам более привычно, "оу щет эта хреновина с двоеточиями". я прекрасно знаю, что это вызов виртуальной функции. а вот вы одновременно пребываете в уверенности, что тут "CDialog::SetWindowText" где-то какой-то временный объект
----
для Pure - это парадокс, но здесь мы не спорим о том, что в конкретной ситуации использование данной конструкции может быть обосновано - это очевидно, она ведь есть в языке
. я лично борюсь против термина "надуманные гипотетичекие проблеммы перекрёстного использования пространств имён с одинаковыми функциями"Запись от vxg размещена 31.07.2012 в 09:28
-
vxg , вы с гризликом уже просто потонули в своём "А БАБА ЯГА ПРОТИВ", давайте ещё приложим сюда цитаты из корейского транслэйта на английский и будем его разбирать. В английском языке что бы сказать НЕ ИСПОЛЬЗУЙТЕ применяют выражения
DO NOT USE или YOU SHOULDN'T USE
- так какого хрена ты писал что это не так
Не надо пытаться тут привселюдно полить меня грязью, я не собираюсь брать транспорант и идти в бой. Когда надо пишу хорошие и понятные приложения лишённые всякого бреда а также "квалифицированных имён"
Вам ни Шильдт, ни куча примеров ничего так и не сказали - я уже говорил в среденевековье для людей земля была плоской и центром вселенной, а сама она стояла на 3-х китах, что ж оставайтесь в своём среденевековье, возможно когда то прогресс прийдёт и к вам)))
Но что мне спорить, всё равно твой мозг и мозг твоего товарища придумает очередной тролинг, на пустом месте
Запись от -=ЮрА=- размещена 31.07.2012 в 09:54
-
Ах да vxg чтобы ты знал что такое временный объект и как завязаны между собой CWnd CDialog и потомок CDialog коим является экземпляр класса для текущего приложения, покури этот код (надеюсь у тебя нет проблемм со зрением и увидишь что CFirst::SetOutputText("test") работает без конструктора
Проверка http://codepad.org/iCNftiFfC++ 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include <iostream> using namespace std; class CFirst { public: CFirst(){cout<<"CLASS CFirst constructor\n";} static void SetOutputText(const char * str) { cout<<"CFirst SetOutputText : "<<str<<endl; } }; class CSecond : public CFirst { public: CFirst pFirst; CSecond(){cout<<"CLASS CSecond constructor\n";} static void SetOutputText(const char * str) { cout<<"CSecond SetOutputText : "<<str<<endl; } }; class CThird : public CSecond { public: CSecond pSecond; CThird(){cout<<"CLASS CThird constructor\n";} static void SetOutputText(const char * str) { cout<<"CThird SetOutputText : "<<str<<endl; } }; int main() { CFirst::SetOutputText("test"); cout<<"\tDeclare CThird\n"; CThird pThird; pThird.SetOutputText("test"); return 0; }
На сим пока и дорости сам до уровня, чтобы с тобой было о чём говорить, а не выслушивать твой бред...Запись от -=ЮрА=- размещена 31.07.2012 в 10:17
-
Запись от vxg размещена 31.07.2012 в 10:19
-
о да, увидел ваш временный объект. раскрою вам глаза - это не временный объект даже в вашем понимании:
1. вы переврали класс сделав функцию SetOutputText статической - давайте вспомним, что она виртуальная и унаследована от базового класса
2. даже если закрыть глаза на то как вы лихорадочно заметаете следы собственной невежественности, то для вызова статической функции "CFirst::SetOutputText" не нужен никакой временный объект
Запись от vxg размещена 31.07.2012 в 10:23
-
Не по теме:
PS:Некая ненормативность лексики в моих ответах появляется в тех случаях, когда встречаю уаппонента полное непонимание, а порой и его "святую глупость" , к сожалению я вспыльчив (это мой недостаток с которым продолжаю бороться). Так что прошу у всех прочитавших эту тему от начала до конца, прощения за некоторые грубости в тексте (доводят люди иногда:pardon:)
Запись от -=ЮрА=- размещена 31.07.2012 в 10:24
-
Запись от ForEveR размещена 31.07.2012 в 10:42
-
Запись от ForEveR размещена 31.07.2012 в 10:45






