Возвращение Бьерна Жаваблядям - капут Питонисты рыдают И дотнет не спасут Тьма нахлынет за тьмою Из восставших степей Морем мора накроет Стадо жирных свиней Их телами украсит Все столбы фонарей Кровью лиспер окрасит Их отравленный Рейн Вопреки Откровенью Вряд ли выживет треть Языкам их - забвенье И их паттернам - смерть На потеху сиблядям Их прогресса плоды Нет того, что могло бы Спорить с мощью орды
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать? Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли? A:
Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Вопросы по синтаксису идут на хуй
Лабы идут на хуй
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй
Все идут на хуй
Хейтер сосет члены на пару со своей мамашей
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешниесервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++? A:
Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
Скорость
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
Мощь
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.
Популярность
C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел! A:
Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него! A:
Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполневозможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад! A:
Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Этифичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать? A:
Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Автор(ы)
Название
Год
Ссылка
Бьерн Страуструп
Программирование. Принципы и практика использования C++
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Автор(ы)
Название
Год
Ссылка
Ален Голуб
Веревка достаточной длины, чтобы выстрелить себе в ногу
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Q: Я готов начать погроммировать! Куда мне писать код? A:
На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
Платформа
Название
Описание
Ссылка
Windows
Microsoft™ Visual Studio®
Общепризнанно самая продвинутая и удобная IDE, не имеющая равных по части автодополнения и возможностей отладчика. По ссылкам справа можно скачать бесплатную редакцию последнего выпуска (2015 Community Edition). Кроме того, существуют редакции с расширенными возможностями (Professional и Enterprise). Они стоят сотни денег, но если ты студент вуза, подписанного на Dreamspark Premium, то ты можешь получить их безвоздмездно (то есть даром). Многим новичкам интерфейс студии кажется чересчур сложным, так что обязательно прочти этот гайд, если у тебя возникают проблемы с компиляцией хэллоуворда
Простая, легковесная, кроссплатформенная, швабодная IDE. Менее навороченная, чем студия, но среди бесплатных вне конкуренции. Вероятно, это наилучший вариант для новичка с *nix. Под Windows же требует чуть больше ебли с установкой компилятора MinGW/LLVM
http://codelite.org/, "sudo aptitude install codelite codelite-plugins"
для установки под *nix
Все
CLion
IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию на год по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использоватьтекстовыйредактор в связке с каким-нибудькомпилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу! A:
Без проблем:
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio
Гугловский фреймворк для автоматизации тестирования
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы? Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать? A:
Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
libcurl - сишная библиотека для работы с сетью (существует также curlpp - крестовая обертка для нее, но использовать ее не стоит, ибо разработка заброшена еще в 2009 году)
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше? A:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
>>786440 Формально - никак. Стандарт ничего вообще не гарантирует о доменах для плавающих чисел, поэтому может не влезать в обе стороны. Единственный корректный вариант - каждый раз вручную сравнивать с INT_MAX или типа того. Но вообще, если у тебя возможны настолько большие числа, то проблемы будут не только с double, а вообще с любыми операциями из-за постоянных проверок на переполнение, поэтому лучше сразу прикрутить какую-нибудь библиотеку длинной арифметики и не велосипедить хуйни.
>>786599 Множество значений, которые могут храниться в этом типе. Это для плавающих не то же самое, что диапазон - например, 1.0 превратится в что-то типа 1.00000002. >>786647 Ну хорошо, мистер буквоед. Гарантируется, что long double может хранить значения из double, а double - значения из float. Ни ширина диапазонов, ни конкретные допустимые значения (в.т.ч. наличие NaN и +-Inf), ни направление округления, ни соотношения с диапазонами целых не гарантируются (например, реализация, в которой все плавающие имеют единственное значение NaN, вполне корректна с точки зрения стандарта). Некоторые гарантии предоставляет стандарт IEEE-754, но стандарт крестов не обязывает ему подчиняться. 3.9.1/8, 4.6, 4.8.
>>786700 > Ни ширина диапазонов, ни конкретные допустимые значения (в.т.ч. наличие NaN и +-Inf), ни направление округления, ни соотношения с диапазонами целых не гарантируются (например, реализация, в которой все плавающие имеют единственное значение NaN, вполне корректна с точки зрения стандарта). Ты бредишь, прими таблеток. Как полегчает, взгляни на пикрелейтед.
>>786846 Это кусок сишного стандарта, причем одного из новых. Даже от старого сишного стандарта кресты зависят только в тех местах, где это явно указано в крестовом стандарте (например, для размеров целых чисел), а для плавающих таких упоминаний нет. Хочешь аргументированно поспорить - приводи выдержку из 14882 2014, где есть ссылка на этот твой 5.2.4.2.2, иначе с тем же успехом ты мог бы принести стандарт D или еще хуй знает что. >>786854 Опровергни.
>>786904 Я не доебываюсь, просто ты ошибаешься. Смотри, гарантируется текстуальная идентичность файлов. Не гарантируется идентичность ограничений непосредственно на типы (только опосредованно, через FLT_MAX etc). Не гарантируется, что у a<b в C++14 и C99 одинаковая семантика.
Возможна, например, следующая ситуация - в реализации C99 нормальное представление float через IEEE 754, а в реализации C++14 у float единственное значение NaN, не сравнимое ни с чем. В общем хэдере cfloat есть строчка #define FLT_MAX yoba, где yoba есть implementation defined константа какого-то implementation defined типа (в 5.2.4.2.2 не говорится ничего о типах, только о сравнимости), который можно сравнивать с float. К примеру, это может быть long long и его лимит, который оказался превосходящим 1E+37. Когда хэдер используется из C99, все работает очевидным образом - yoba сравнивается с 1E+37 по правилам сишного сравнения и, разумеется, оказывается больше всех конечных чисел. Когда хэдер используется из C++14, крестовая операция сравнения фейлится над единственным возможным значением NaN, а других нет. Смекаешь? Ты был бы прав, если бы в сишном стандарте было прописано требование включать в хэдер сам литерал 1E+37 - тогда из такой извращенной реализации крестов нельзя было бы подключить его без ill-formed исхода. Но этого требования нет, поэтому все требования на тип пропадают при изменении семантики трактовки хэдера с сишной на крестовую. Такие дела.
>>786967 Нет же. Гарантируется эквивалентность значения, например, функции max () значению, которое есть в хэдере, который парсится из крестов, и семантика при этом не гарантируется совпадающей с семантикой парсинга этого же хэдера из сей.
>>786971 >семантика при этом не гарантируется совпадающей с семантикой парсинга этого же хэдера из сей Месье, в C11 и C++14 семантика сравнения fundamental types почти одинаковая и четко определяется.
>>786972 Да ты охуел, блядь, у нас тут не политач, чтобы маневрировать. Я тебе показываю конкретные дырки в твоих рассуждениях, из-за которых они ломаются, чтобы найти истину, а ты с лицом обиженки машешь своими убеждениями. Определись с целями уже.
>>786981 Да, но она определяется в терминах "если a>b в математическом смысле, то a>b вернет true". Поэтому, очевидно, если значения a и b implementation defined, то и результат сравнения - тоже.
>>786987 >Поэтому, очевидно, если значения a и b implementation defined, то и результат сравнения - тоже
Нет. Определен диапазон float, который минимально вмещает (-2^37, +2^37). Так что не может быть реализации, в которой float будет иметь один NaN. Кстати, ни NaN, ни INF стандартами С++ и C как раз не гарантируются.
>>786995 Не спиздел, это правда. Даже чисто с точки зрения здравого смысла - если бы они гарантировались, не было бы проверки их наличия в numeric_limits.
>>786993 >float, который минимально вмещает (-2^37, +2^37) Разве? Там есть джва утверждения: любой float меньше FLT_MAX; 1E+37 меньше FLT_MAX. По твоей логике, если x<y и z<y, то x<z, так, что ли?
>>786993 >меньше или равен Ага, пардон. >float a = FLT_MAX Да, в этом ты прав (я просто забыл о приоритете плавающих типов при преобразованиях аргументов).
Но получается такая штука - мы знаем, что у float в C такой диапазон, знаем из крестового стандарта, что текстуально хэдеры идентичны в крестах и C, но по-прежнему нет гарантий, что текст "float" в хэдере означает одно и то же в крестах и C. Где утверждается, что тип float из крестового стандарта это в точности float из сишного? Конечно, логично, что это реально так, но если уж мы разбираемся с гарантиями стандарта, то нужно подходить формально.
>>787033 Заебал со своей высосанной из пальца конспирологией. Очевидно, что многие вещи в стандарте подразумеваются, а не прописываются явно. Никому (кроме тебя) не приходит в голову доебаться до чего-нибудь вроде того, что в стандарте нет гарантии, что буква "a" на одной странице эквивалентна букве "a" на всех других страницах. Или если стандарт ссылается на пункт 1.2.3.4, который прописан жирным шрифтом, а ссылка на него обычным — то должна быть гарантия, что это один и тот же пункт.
Анон, какой тип выводится для переменной x? Указатель на строку? Почему? Как итерировать возвращенный из этой функции массив при помощи серийного оператора for?
Ты тут возвращаешь одну строку, а не массив строк. Указатель на массив = указатель на первый элемент. Таким образом ты возвращаешь указатель на первый элемент.
Массив тебе просто так не вернуть из функции. Ты можешь вернуть только указатель на него. В противном случае используй один из контейнеров.
>>787068 >string (&f(int i))[10] Впервые вижу такое. Что делают квадратные скобочки в объявлении функции? Почему функция объявляется как указатель? Почему это компилируется? Ссылки можно?
>>787105 >>string (&f(int i))[10] >Ты тут возвращаешь одну строку, а не массив строк. c++decl> explain class string (&f(i))[10] declare f as function (i) returning reference to array 10 of class string
Господа, нубский вопрос. Но стресс-ситьюэйшн - котелок плохо варит,
сервер для простенького чатика нужно реализовать с использованием потоков, а я туплю и не могу сформировать условие - что именно в этой ситуаци должен делать поток?
просто про потоки читал, но не соображу в каком контексте использовать. Сейчас ищу ответ на вопрос., но может двачер подскажет раньше. спасибо
>>787827 Хуёвая идея, если ты про потоки ОС – слишком большой оверхед.
Самая распространённая в веб серверах реализация – n+1 нативных потоков, между которыми шедулятся легковесные, которые как раз можно спамить сколько влезет.
>>787838 Ну во-первых, никто не говорил про потоки ОС, во-вторых, никто я имел в виду пул потоков, а в-третьих, какая мне похуй разница, а? Анон просил любую идею, анон получил.
>>787838 А вот есть standalone-либа для реализации исключительно зеленых потоков и подобной хуйни? Вроде бы хочется иногда нашакалить вместо std::thread, но вечно оказывается, что вместе тянется какой-нибудь ебаный фреймворк, который тяжелее мамаши Энтони.
Вопрос не по конкретно C++, но в других местах врятли получу нормальные ответы. Подаю резюме на C++ джуна в аутсорсинговую компанию. Чего ожидать? Никогда не работал в аутсорсе, только в ламповых кухнях. Как выглядит работа джуна ремоут? Меня что, будут учить по скайпу? Есть ли специфика относительно C++?
Антуаны, платина в треде. Насколько будет сложно перейти от С к С++, если первый знаешь так себе и при этом немного писал на С# и Python. Хочу угореть по встраиваемым системам и компуктерному зрению.
Есть где почитать про реализацию сетевых приложений? Заканчиваю Таненбаума читать комп. сети основы. Хотелось бы узнать как реально все проектируется, запиливается, подводные камни етц. Желательно конечно на крестах/сишечке.
>>788467 Чем вообще отличаются TCP/IP Illustrated от Network programming? Первое это подробная работа стека протоколов, а второе уже реализация приложений, так?
>>786424 (OP) я ньюфаг, так что не пинайте. Подскажите (дайте ссылку) минимальную/древнюю сборку mingw для компилирования в x-64 (достаточно стандарта 99) Спасибо.
Анон, почему здесь ошибка выполнения? У меня две перегруженные функции: одна принимает константные ссылки и возвращает конст ссылку, а другая такая же, но ссылки обычные. Эта функция использует первую для вычисления возвращаемого значения. Кланг компилирует, но программа ничего не выводит в терминал.
Либо, если у тебя Visual Studio: Правой кнопкой на проекте -> Свойства(Preferences) -> В левой колонке компоновщик(Linker) -> Ввод(Input), туда вводишь wtsapi.lib.
Если всё равно не залинкуется - проверь, может, он по-другому называется.
В GCC и подобном нужно в опциях сборки указать -lwtsapi. Но тут может сработать, а может и нет. Линковка в GCC вообще говно.
>>788726 >Но тут может сработать, а может и нет. Линковка в GCC вообще говно. Ебаный стыд. Хули ты советы даешь, умник, если man не осилил? Не работает у него, блядь.
>>788731 когда линковка может зависеть от расположения с списке зависимостей и фазы луны Еще один, блядь. Порядок действительно влияет на результат, но это четко прописано в man'е.
>>788756 Все правильно. В данном коде вторая функция не является constexpr и результат из function-call нельзя использовать как constexpr. А если сделать scale(3), то результат будет constexpr
В qtcreator clang code model выебывается и не находит std::make_unique (не находит и подсвечивает как ошибку). CONFIG += c++14 прописал. clang v3.8 Нахуй так жить, поцоны?
>>788761 В глаза ебусь - не заметил этой массива. Кароч clang очень умный и зоделол static values propagation. Сделай пример посложнее и работать не будет.
>>788760 А то. Как и положено - 3 штуки. Я уже незнаю что происходит. clang code model вырубил - все норм. Но мне без него плохо. Судя по всему этот плагин как-то пидорасит символ `__cplusplus`.
>>788766 Можешь подробнее о static values propagation? Гугл молчит, но говорит, что значение в скобках должно быть constant expression, но: https://ideone.com/B4hLLg
>>788774 static values propagation - это сворачивание ситуаций типа: int a = 4; int b = a; int c = b; к: int a = 4; int b = 4; int c = 4;
А с примера я тоже в ахуе. С одной стороны оно и понятно - массивы из C в современном c++ не используют. Но с другой стороны стало интересно. И в общем, это - расширение clang'а: http://clang.llvm.org/compatibility.html#vla
Т.е. это не по стандарту и в других компиляторах может не работать. Но там, где работает, эта запись будет эквивалентна "new <type>[size]"
>>788791 Не знаю насчет clang, а про gcc писали, что оно работает только для автоматических массивов, и вместо выделения на куче будет нормально пихать их в стек, типа вместо DEC EBP, const станет DEC EBP, yoba.
Экспериментирующий питуз вернулся. Это что же получается: из функции можно вернуть указатель на любую функцию, реализующую что угодно, лишь бы тип этих функций был одинаковый? Какие профиты из этого можно извлечь?
>>788861 Функцию можно вызывать без разыменования указателя, просто pf(x, y). >Какие профиты из этого можно извлечь? Без контекста функции обычно мало полезны, поэтому возвращают классы или лямбды.
1. господа. юзаю sublime text, но настраивать его заебался - всякие мелочи доёбывают. в TOOLS , на панели наверху, когда очередной раз скачал и установил - вместо RUN, вылезло Build with... И эта хуйня каждый раз при запуске просит выбрать - просто билдить или с запуском. а мне нужно просто запуск делать. Подскажите. кто юзает, в каком месте эта хуйня настраивается?
2. Пишу простой сервер-клиент. инструменты с++ и линукс. приложение делаю с использованием std::thread. то есть многопоточность. С сетями раньше не игрался. Вот нужен совет, в плане конструкции. Насоветуйте плз, место для полета, куда можно воткнуть многопоточность, в указанном контексте: типа отдельным потоком слушать клиентов, потом отдельным потоком отдельных клиентов обрабатывать и прочее...
Параметризация типа переменнойАноним06/07/16 Срд 18:40:56#127№789748
Был алгоритм для работы с unsigned short массивами. Выделение памяти, вычисления и т.д.
Затем я понадобилось тем же алгоритмом обрабатывать unsigned __int8 массивы. Я сделал копипаст с заменой типа везде + мелкие доработки (но на 99% алгоритм остался тем же самым).
В начале программы теперь идет ветвление, которое выясняет какой будут тип входных данных, плюс ветвление в конструкторе, деструкторе и одной процедуре.
Как можно все эти действия параметризовать? Шаблоны для этой цели созданы? Что в итоге работы шаблоном сгенерится? Тот же самый код с ветвлением? Как эта проблема решается в нормальных языках программирвоания, типа Haskell, Agda?
>>789748 >Шаблоны для этой цели созданы? Да. >Что в итоге работы шаблоном сгенерится? Такой же код, как если бы ты вручную копипастил тело шаблона. Используешь для двух разных типов - будет два похожих куска кода. >Тот же самый код с ветвлением? Ветвление избыточно, если компилятор уже знает, какой нужен тип. С шаблонами в бинарнике останется только тот код, который ты реально используешь. Например, если ты заменил unsigned short на unsigned __int8, то код для второго типа автоматически сгенерируется, а код для первого - автоматически удалится. >Как эта проблема решается в нормальных языках программирвоания Полиморфизм бывает двух видов: ad hoc (это то, что будет с шаблонами) и динамический (с автоматическим "ветвлением"). В "нормальных языках" (например, в C++) доступны оба варианта на твой выбор.
Гайз, к ньюфагам лезть не хочу, потому простой практический вопрос сюда : На linux (убунту) если под редактор текстовый писать - как нибудь можно сделать чтобы программа запускалась в отдельной консоли? Как на винде короче. Под кодблок писал - там вылезало в отдельном окне. Но я под виртуальную машину пишу , и на нем тормозит ide.
Анон, какого хуя можно вызывать неконстантные методы у константного объекта? Это ведь запрещено, потому что неявно передается ссылка this на константный объект, которую надо модифицировать при помощи const для возможности вызывать методы у const объектов.
>>789843 Тогда что такое константный объект? Разве const Person p - это не определение константного объекта? В этом случае this должен иметь тип const Person *const
>>789856 У меня в коде вызываются обычные функции у константного объекта. Обычной функции неявно передается this типа T *const. При вызове функции у константного объекта this имеет тип константного указателя на константный тип. Это должно вызывать ошибку компиляции, потому что типы this не совпадают: невозможно передать указатель на const объект как обычный указатель.
>>789778 >С шаблонами в бинарнике останется только тот код, который ты реально используешь. У меня вообще не в этом проблема. Проблема состоит в том, что я не знаю какого типа данные мне придут на вход. К примеру, это могут быть массивы чисел double, а могут быть массивы unsigned __int8. На этапе разработки и компиляции мне ничего не известно о входных данных. Но я должен предусмотреть обработку или всех или некоторых. В связи с тем, что мои действия по обработке схожи я хочу параметризовать входные типы.
Такая ситуация : запускаю простое приложение сервера. как я понял оно запускается в сайлент режиме - об этом я узнаю по ошибке, которую выдает сублим при следующем запуске - порт занят. как это гуглить - хз. по-крайней мере понял что прога нормальная.
посоветуйте выход из ситуации? как минимум запуск приложения в отдельном окне
>>789911 если это в настройки сублим пихнуть - будет работать?
Ребята, Сижу - пишу код на linux (ubuntu) Пишу tcp-server. Юзаю Sublime Text 2.
Такая ситуация в общем. : запускаю простое приложение сервера. Оно мне жаловалось после одного запуска, что мол адрес занят. А я только потом понял, что оно запускается типа в "сайлент режиме" - т.е если запустить "хелловорлд", то сублим выдаст результат в консоль. А если сервер - то никакого окна не будет. и не пойму как убить процесс запущенный. и даже как проблему гуглить не пойму.
посоветуйте выход из ситуации? как минимум, что бы отдельный запуск окна был. Что-то донастроить. Или пересесть за другой редактор?
>>790007 лалка, покомпиль из консоли для начала, чтобы разобраться с фазами компиляции и не задавать тупых вопросов. Каждую мелочь тебе никто рассказывать не будет. Про tcl ты прочитал, а про компиляцию, пайпы и демоны не прочитал. Ну и нахуй мучать жопу, когда срать не умеешь?
Прошлый тонул, оказывается.http://ideone.com/kix7uE почему тут функция getDebt спокойно видит getPerson из другого неймспейса без какого-либо указания на него, без using'ов и т.д.? Всего лишь потому, что структура Debt использует структуру из того неймспейса? А если добавить в pers какую-нибудь переменную, то её, разумеется, не видно ( http://ideone.com/RSkTG2 ).
>>790255 Это называется поиском Кенига (гугли Koenig lookup или argument-dependent lookup). Суть (упрощенно) в том, что при поиске функции по имени к текущему неймспейсу добавляются неймспейсы, в которых объявлены типы аргументов. Для переменной это, очевидно, не работает, потому что никаких аргументов у нее нет.
Анон, я засел на такой проблеме: как перенести определение конструктора SalesData (std::istream &) в тело класса? Этот конструктор использует функцию, которая определена ниже. Определить выше ее нельзя, потому что тогда ошибка будет из-за того, что ниже находится определение класса.
В шапке говна мамонта в качестве литературы по С++. На носу С++17, а они всё книги из 2002 года читают. По сравнению с С++98 многое стало неактуальным, а некоторые старые практики попросту вредными. Я бы советовал нбюфагам читать как можно более свежую литературу, пусть и не классику. У Майерса к примеру по С++11 и 14 вышли книги, хуле их нет в списке?
>>790537 Есть там новый Мейерс, не ебись в глаза. Шапка составлена весьма грамотно, книги, которые действительно устарели, помечены как deprecated. В том же Мейерсе или Саттере советы практически не протухают, особенно если каждую идиому дополнительно гуглить, когда читаешь. А переписанных заново аналогов им нет (новый Мейерс рассказывает конкретно про фичи нового стандарта, а не правит старые указания), поэтому энивей лучше прочитать и потом немного подкорректировать, чем не читать вообще.
>>786424 (OP) Народ, поясните за хуйню. Вот у меня int pi = new int; Вот я делаю delete pi; И что теперь? Что происходит в ебаной машине? В книжках по факту нихуя не говорится, блядь, как это все работает. Я блядь один хуй могу взять после этого въебать такое pi = 1; cout << *pi << endl; и все будет ок, будет работать. Если я так правильно понял, просто потом, когда я следующий раз выделю память, то как раз на это место может указывать указатель, а если я не напишу delete, то на это место указатель уже не сгенерируется никогда? Я прав?
Господа, врываюсь в мой любимый тред, где сплошь элита. Вопрос на чисто поболтать, с примечанием : Я вот буквально пару дней назад сел писать код в ubuntu. Сижу, блять , ебусь с этой херней. Столько нюансов и прочее. Лень, но постараюсь не стать не неосилятром. Буду тихо давить. Поясните за программирование на unix. Почему все так дрочат на него? Я понимаю, что возможно высокий входной порок - дает почувствовать себя элитой. И понимаю, что возможные плюсы я еще не видел - ведь только сел за это дело. В общем господа, поясните «чекаво»
>>790690 >intЗВЕЗДА pi = new int; В куче выделяется место, указанное платформой для переменной типа инт; в стэк идет переменная типа указатель на тип инт.
>delete pi; В куче удаляется переменная, на который указывает pi, и заменяется null-ом. Освобождается ли память? А хуй знает, самому интересно, ведь null это тоже инт. Но я могу быть и неправ, так как хуй простой, заменивший обучение по книге обучением методом проб и ошибок.
>>790803 Ты меня не слушал штоле, сука, ебаная тетя? Для кого я объясняю? Сначала объявляешь класс (без тела, просто class YourMomma;), потом объяляешь функцию (просто void makeBorsch (YourMomma &);), потом, блядь, определяешь класс (class YourMomma {...};) и, наконец, определяешь функцию (void makeBorsch (YourMomma & momma) {...}). Теперь пиздуй реализовывать эту ебалу, а если еще раз придешь сюда с долбоебским вопросом, я приеду и лично выебу тебя в ленивую сраку, аутист, блядь, хуев.
>>790862 >почему все дрочат на него Нихуя не дрочат, никсоиды вообще больше по сям. Алсо, шапка крестотреда вообще довольно сильно заангажирована под студию и венду, а любители пердолинга уже несколько раз на моей памяти были обоссаны спермогосподами.
>>790871 Какого это компилятора нет на венде, ну-ка ну-ка? Из инструментов могу вспомнить разве что valgrind, но это уже скорее стиль мышления и разные подходы.
>>790873 Продолжайся наслаждайся дальше еблёй с зависимостями на шинде, причём на всех стадиях. Только это всем юниксподобным системам уже даёт юуст на 9000 очков.
>>790905 Если буст/Qt/OpenCV - с ними на шинде ещё всё более менее цивильно.
Но не дай, блять, бог тебе придётся собирать что-то с незавендоренными зависимостями (особенно ГНУтым говном, с кривыми портами пятилетней выдержки) - ты не надолго останешься на этой ОС.
>>790908 >там есть пакман как в арчике Регулярных обновлений как в арчике нету, хотя раз в год популярные хуитки таки обновляют (но никсовым софтом вроде вима без гуя пользоваться невозможно).
>>790939 >И мингв, и куча говнолиб, и пиздон Если они не обновлялись бы, смысла в этом проекте не было бы от слова совсем насколько я помню, это кстати уже не вторая и даже не третья попытка, где там его предшественники?
>>790952 >gnuwin, unxutils и пр. Про эту херню не слышал даже, а цыгвин - он изначально был не того. Вроде недавно красношапка на него лицензию сменила кстати.
А msys был всегда, но раньше там был башик, а всю хуйню нужно было качать зип-архивами и ставить ручками, а с пакет-менеджером срало заебок.
Впрочем, я слышал, в десяточке уже родили пакетманагер. Это правда? И рабочие столы слышал - тоже впилили таки уже?
>>790955 Столы – да (но их концепция всё же посасывает что у гномовской, что у макосовской, с которой содрана), покетманагера из коробки так и нету, просто пилят "убунту фор шиндовс" официально, когда нибудь да появится.
>>790905 >и вообще любая библиотеканейм? Ставишь mingw-w64, msys. Чего нет в мсисе, ищешь на rpmfind в mingw64-libname пакетах, распаковываешь, копируешь вручную. Хотя кросскомпиляция из под арчика в разы удобнее, конечно.
>>786424 (OP) Я короче нуб и вообще нахуй не программист по специальности, но просто хочу попиздеть за С++, если хотите - доказывайте мне что я не прав, будем дискутировать, ток не обзывайтесь и не оскорбляйте на пустом месте, плес, тошнит от этого всего. Ну или оскорбляйте, мне похуй.
>они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Ну так-то да, только есть ньюанс. Во-первых, шарп в некоторых тестах либо равен либо чуть медленней с++ по производительности. Но это хуйня, есть более серьёзный ньюанс, как мне кажется. Короче, по сути в С++ из коробки нет нихуя. Да и с коробкой тоже. Хуй нагуглишь и подключишь какую-нибудь библиотеку для решения тривиальной для других языков задачи. Да, задача прикладная а плюсы ж ну эт тип крутой езык для системных погроммистов и шобы там на нём всякие крутые математические штуки писать)) Не удивительно, что на нём нет многих таких популярных библиотек и не справедливо ставить ему это в минус НО проблемы начнутся тогда, когда ты в отсутствии уже реализованного и поддерживаемого открытым коммьюнити функционала ебанёшь себе его сам. Сможешь ли ты писать свои библиотеки так, чтобы они работали быстрее чем встроенные / подключаемые библиотеки для других языков? Особенно когда в том же C# такой функционал пилился и поддерживался годами. Короче, это еще большой вопрос. >Используя C++, ты никогда не останешься без работы или поддержки комьюнити. Вот это самый пиздец, мне кажется. Ну, про помощь коммьюнити пиздеть не буду, да, хотя опять же, на тех же C#, Java, Ruby и Python гораздо проще найти топик на stackoverflow где коммьюнити уже для кого-то решило типичную задачу, с которой столкнулся васян, решивший просто без задней мысли написать несложное приложение для автоматизации чего-нибудь. Ну, например, редактирование пользователей через LDAP (ради интереса кстати погуглил как это на плюсах делается, пиздец, объем кода раза в 3 выше). Ну и насчёт работы: как у меня сложилось впечатление, понятия джун-C++ вообще не существует, все ищут только рукастых специалистов с огромным опытом и знаниями (prove me wrong). Где их набирать в таких условиях - хуй его, блять, знает. >в C++ ты никогда не платишь за то, чего не используешь Вот эта фраза очень понравилась, да.
А вообще С++ считаю безусловно пиздатым и достойным изучения языком.
>>791024 >ради интереса кстати погуглил как это на плюсах делается, пиздец, объем кода раза в 3 выше Я от такой хуйни (ну и кучи другой) в дишку вскочил.
>>791024 >либо равен либо чуть медленней с++ по производительности Все правильно, и естественно, что для задач типа написания обычных десктопных приложений шарп подходит немного больше. Фишка в том, что когда тебе нужно писать и хуйню вроде гуя, и высокопроизводительную мякотку (вычисления, хайлоад), то удобнее делать все на одном языке. >Хуй нагуглишь и подключишь какую-нибудь библиотеку Это проявляется не так часто, как многим кажется. Для всех задач, под которые кресты хотя бы отдаленно подходят, есть куча годных либ. Разумеется, есть исключения, но я буквально по пальцам могу пересчитать случаи, когда я не смог нагуглить нужную мне либу. Уровень пердолинга с либами переоценен, уже давно все нормальные либы заточены под CMake и/или имеют пакеты в NuGet. А мелкие вообще зачастую header-only, там ебли нет по определению. >Сможешь ли ты писать свои библиотеки так, чтобы они работали быстрее чем встроенные / подключаемые библиотеки для других языков? Это не так сложно, как кажется. Не для ньюфагов задачка, но, покурив исходники библиотек, без особого труда можно написать свою пристойную. >вообще не существует Еще как существует, но рынок перенасыщен, ибо в универах учат крестам на околоджуновском уровне чаще, чем жабе или шарпу. Это проблема, да. В какой-то степени она компенсируется гарантией, что ты не умрешь от голода, т.к. всегда есть сотни долбоебов, которым нужно запилить лабу или курсач за пару косарей (по мне это лютый зашквар, но кому-то это может пригодиться, лол).
>>790862 >Поясните за программирование на unix. >Почему все так дрочат на него? Хуйня полная, в основном слухи о суперпопулярности и незаменимости линукса распространяют дебилы, подобные местным петухам из /s/. Кстати, в /s/ можно заметить одну интересную вещь: там практически никогда не бывает пруфов зарплат/квалификации любителей порассуждать про ОС. Оно и неудивительно, т.к. вменяемый человек никогда не будет на полном серьёзе увязывать инструмент для решения задачи с какими-то личностными качествами самого решающего эту задачу. Более того, хотя я и ненавижу майкрософт, нужно признать, что .NET платформа охуенная и развивается она охуенно сейчас. Лол, даже для линукспетухов версию выпустили. Сам не перехожу на линукс (хотя и планирую) как раз ввиду того что внешне он убог и его надо не настраивать под себя, тут буквально надо допиливать ОС за разработчиков и криворуких дизайнеров. В линуксе нет удобных хоткеев, к которым я привык в винде. Нету даже аналога Win+стрелки на клавиатуре, это охуенно, я чувствую себя как без рук без этого сочетания да и без остальных тоже. Всё вечно вкривь и вкось, на соплях приделано. Смотри, зашел на двач - зажимаю колесо мыши, страница не скроллится. Ну, вообще. Браузеру просто похуй. Делаю один поворот колеса мыши - тред проскролливается НА СЕРЕДИНУ блядь, просто сразу. На работе была тема, что это говно само по себе вылетало на логинскрин закрывая при этом все мои открытые приложения. Я могу продолжать бесконечно, и понимаешь, вот в этом для меня суть линукса, это как почта россии - никогда не знаешь, где она тебя наёбет, но знаешь, что наебёт обязательно. Да, возможно на какие-то из моих аргументов мне ответят, что в линуксе есть аналоги, но нахуя я буду переучиваться, вот ради чего? Просто для того чтобы перейти на другую ОС? А зачем? Что она мне даст, кроме пердолинга? И да, больше всего омерзительно, что мультиплатформенные версии программ под линуксом выглядят убого. Вот есть PyCharm я там пишу код на питоне и она в винде выглядит красиво и охуенно с моим шрифтом Input. Под убунтой... блядь, нутыпонел в общем.
Хотя надо сказать что работать только через сонсольку без гуи и поднимать всякие сквиды-роутеры писать скрипты и прочую хуйню под линь мне нравится, из консоли он прекрасен и никакая спермодесятка никогда даже не приблизится к этому. Короче, инструменты каждый выбирает по вкусу. >>791024-кун
>>791038 Кстати, я же забыл написать зачем я приложил скриншот. Посмотри на этот скриншот, блядь, в 2016 году нет сортировки по сетке ахах блядь, мне даже добавить нечего, остановите я сойду нахуй.
>>791040 Шапку писали уважаемые люди, манька. Неси контрпримеры или уебывай. Кококок найдены данные, на которых хаскелл быстрее ассемблера в миллион раз!!!!11111
>>791040 >неси тесты Не, впизду мне лень, да и похуй. Не хочешь, не верь, все равно я аргумент со скоростью работы не выставлял как основной, так что мне похуй такщемта.
>>791051 P.S. Хотя своими глазами видел на стэке как кто-то восхищался самонаписанному тесту где шарп натурально ебёт по производительности плюсы. Суть теста не помню, т.к. не шарю и ссылку не дам, лол.
>>791043 Манька - это ты. А я - уважаемый человек, как ты сам выразился. Но это не меняет того факта, что в шапке тема производительности описана крайне стереотипно и не включает каких-либо примеров.
Их и не может быть вообще-то, потому что никто в здравом уме не будет писать два огромных приложения на разных языках только для того, чтобы сравнить скорость языков.
И, кстати, это не я должен доказывать обратное, а ты - утверждение.
Так что на данный момент есть вопрос без ответа. Что быстрее: ПО на медленном языке с оптимизацией горячих точек на C или ПО на C++.
>>791052 Берешь и сравниваешь самую хуевую реализацию на крестах и самую лучшую на шарпе, профит. В качестве бонуса можно продемонстрировать простыню говнокода на крестах, подразумевая, что это норма. Я ничего не имею против шарпа, и этот подход работает в обе стороны с двумя любыми языками.
>>791066 Нет нет нет нет, я не настолько тупой, во-первых пример там был достаточно простой, чтобы я смог его понять, и существенных отличий в реализации там не было, во-вторых тот топик на стеке был достаточно популярен, туда набежало куча крутых специалистов (лол) и я уверен, что если бы там было всё как ты описываешь ему бы незамедлительно на это указали (ведь правда?) и обоссали бы, и тогда я бы даже не стал этот пример упоминать. Сейчас пытаюсь найти тот тред, безуспешно.
>>791052 Либо это сравнение производительности библиотек, либо пиздишь. Правильный код после компилятора C++ ты хуй оптимизируешь, так что сказки о том, что че-то там быстрее эквивалентного c++'сного кода, можешь втирать, например, в C#-треде.
>>791070 Фото рассчётных листков с указанием должности, любые фото сертификатов с пруфами. Фото полузамазанных бейджей из яндекса/интела с пруфами (хотя последнее ладно, понятное дело что не все хорошие специалисты в яндексах работают). То есть вот пишет ебанутый про анального господина и все такое там, и чтобы прям рядом фотка какого-нибудь сертификата по специализации RHEL и т.д. Суть в том, что я себе такую ситуацию просто даже вообразить не могу, т.к. не могу вообразить ни одного из многочисленных микрософт/циско/джунипер/авайя/линукс профешшионалов с которыми я общался говорящими то, что говорят обычно в /s/.
>>791063 А вот и аутисты подъехали. Еще раз: нет никаких вменяемых сравнений одного и того же продакшен кода ПО на разных языках. Поэтому формально нельзя говорить, что проекты на C++ работают быстрее, чем проекты на других языках. Маня-тесты каких-нибудь коллекций будут либо одинаковыми(например в питоне словарь и массив - простые обертки над C-кодом, как и половина стандартной библиотеки), либо нихуя не будут отображать ситуацию в продакшене, потому что умные люди запилят критические места на C.
Так что спор на тему "язык A быстрее языка Б" в наше время - яркий представитель специальной олимпиады.
>Скачан: 1232 раза Хуя. Это получается, у меня будет ещё 1200 конкурирующих макак, и расчитывать на работу в РФ, связанную с крестами, ньюфагу смысла нет?
Code block : запустить два проекта одновременно!Аноним08/07/16 Птн 04:22:49#216№791159
Гайз, поясните за code block's, под unix : как заRUNить два проекта одновременно (они друг другу пакеты шлют, вроде) не хочу изворачиваться. Просто видел видос, где парень просто среду дважды запустил, но я не понял как он это сделал.
Ебучий будильник не сработал. Проспал лишних три часа, в течение которых видел бугуртный сон про бывшую и ее ебыря. Проснулся, пришел на кухню, батя как раз доел мой сыр. В доме ебаный мороз +12, горячей воды нет уже больше недели, я грязный и вонючий, как задница у бомжа. Захожу в свой любимый тред, чтобы хоть немного позитива словить, но и здесь, блядь, за ночь насрали неосиляторы.
>>790690 >Я прав? Да. Он где-то там у себя записывает, что память свободна.
>Я блядь один хуй могу взять после этого въебать такое Где как. Вижуал студия не даёт даже обратить к pi после удаления, XCode же даёт и новое значение присвоить. ideone, как говорил >>790863, обнуляет память.
Я тоже хуй простой, могу деталей некоторых не знать.
Есть такое задание, ничего больше стандартных библиотек не знаю, чё читать(курить) по теме этого задания??
Есть определенная иерархия папок. Надо все их просканировать на *.h файлы. Во всех папках надо найти все конструкции вида #define IDD_WIZARD_PAGE 101 и распарсить их, составив словари IIDD_WIZARD_PAGE - 101 для каждой папки. Программа должна уметь: 1) Игнорировать часть папок. Список папок задавать в отдельном файле. 2) Показывать дубликаты. Дубликатом считать если число одинаковое в разных папка, а ID разное. 3) Выводить на экран список занятых диапозонов значений для конкретной папки.
>>791338 Аноны, чувствую себя идиотом, но как нормально скомпилировать первый хэлоуворлд из книги Шлее "Qt 5.3. Профессиональное программирование на C++"?
http://pastebin.com/3sfRT9Bx Правильно ли я понимаю, что для реализации метода add мне нужно ещё и "геттеры" добавить для получения x и y у объекта m? В задании ничего не сказано, просто описания методов сделать. Но ведь по-другому же я никак не могу до m.x и m.y добраться (по крайней мере, с текущими знаниями). showmove, насколько я понимаю, предполагает лишь текстовый вывод. Очевидно, что перенаправлять вывод cout'а и парсить полученный текст звучит немного сумасшедше.
>>791382 Хм, стоило-таки вслепую попробовать перед постом. http://ideone.com/noyZcG Внутри метода одного объекта можно обращаться к приватным атрибутам другого объекта того же класса, что ли? Что-то я не врубился.
>>791384 я не могу,у меня задание такое,в общем у меня примерно такие мысли :
Реализовать класс деревьев, у которого для каждой вершины(папки) будет вектор в котором будут лежать указатели на новые вершины(подпапки). Далее будет метод, который будет рекурсивно вызываться и при помощи функций FindFirstFile , FindNextFile заносить директории в вектор вершины дерева, также, будет метод, который позволит из вектора достать эту директорию. Потом, по этим директориям можно будет открывать файлы для записи и для чтения. Также нужно организовать некоторое условие, что если в названии папки есть ".h" то её нужно открывать. Ну, а после уже - парсинг этих файлов.
Хотя мне кажется это какие-то пиздецовые велосипеды,но я лучше ничего не вижу.
>>790690 После delete - мы маркаем участок памяти как удаленный. Что с ним будет делать компилятор, ось и так далее - не важно. Сразу ли память освободится? Implementation defined. Самое важное - что любое обращение к удаленному указателю - это UB.
>>791188 >50% из них даже не откроет скачанное. Вот кстати знакомо. Половина накачанных мной учебников и просто научпопа лежат "на будущее", когда реально в текущий момент я читаю от силы 2 книжки, читаю постепенно и вдумчиво. Часть уже вообще удалил, потому что передумал изучать описываемые в них темы, лол. Ещё часть не осилю скорее всего никогда, потому что не хватит времени на прочтение "всех хороших книг".
Анон, сделай мне код ревью: https://ideone.com/Cl9LQO Уебищную императивную дрисню не получится сделать красивой, как код на лиспе, но можно улучшить.
На SO подобный код отхуесосили за то, что в функцию передается не итератор, а указатель на Node, и хуесосящий сказал, что надо зделоть что-то вроде Reverse (ListIter head). Но тогда итератор объявляется как нечто вроде typedef ListIter Node * или тут не уверен с использованием using. Но зачем это нужно, если в таком случае итератор это просо псевдоним для указателя на Node?
>>786424 (OP) Ебануться. Ссылки, указатели. Нихуя не понятно. Ссылка не обьект. Указатель может ссылаться на ссылку, ссылка на указатель нет. Ебанутая теория просто. Читаю Липмапа из шапки. Или это перевод хуевый либо я тупой. Невозможно понять ебанутый сухой текст с припезднутыми примерами, указатель в указателе Пошло нахуй.
Есть крестобляди-фрилансеры с Upwork.com? Есть работа вообще? Сам пишу на Ruby on Rails, относительно успешно. Неплохо знаю няшную, но работа по ней даже не ищется (там даже скилла "с" в БД нету). Думаю С++ подтянуть и иногда брать заказы, чисто для разнообразия. Немного поискал, как-то маловато работы на первый взгляд. Поделитесь опытом, что делаете, легко ли заказы находить.
>>792034 Я предлагал закинуть шапку в пастебин, но у них тут какое-то голосование проходило и они так решили. Мде. >>791989 На фрилансе только qt и computer vision (opencv). Слышал, что там 200 зеленых сняли с некоторых за услуги. С тебя брали?
>>792113 Блять, ебаный C++. Когда из простого класса делал шаблон, в конструкторе, принимающем istream, оставил T temp = 0, которое было для инстов. И компилятор на это даже не ругнулся.
>>791988 Указатель на ссылку не может существовать, так как ссылка - не объект. Ссылка на указатель может существовать, так как указатель - это объект. У тебя очень плохой перевод.
>>792353 >только проблем наберешь. и в каком плане проблем? выстрел в ногу или течь в памяти? просто как реализовать в функции не в методе класса работу с обьектом класса?
>>792037 >Слышал, что там 200 зеленых сняли с некоторых за услуги. С тебя брали? Нет. Что за бред? Upwork, конечно, охуел в последнее время, качество сайта и программыы падает, а комиссии растут, но не настолько, чтобы бабло без предупреждения забирать.
Ребята, объясните, чему тут Прата говорит что если взять адрес от массива, то: "применение операции взятия адреса & к имени массива позволяет получить адрес всего массива..." Что, какой нахуй весь массив блядь, если это просто адрес? Адрес ебучего первого элемента? Поясните, пожалуйста
>>792679 Я бы не сказал. Вот например следующая проблема. Я хочу сделать какой нибудь дженерик класс, который бы мне печатал любую хуйню, какую бы я в него ни запихнул. Как мне передать в функцию любую переменную(объект), не перегружая функцию несколько раз.
Как отправить правильно сообщение через SendMessage? При нормальном нажатии кнопки - первый пик с "Помещено", а у меня почему-то как на втором - "Отправлено". Что я делаю не так? В остальном сообщения одинаковые в Spy++.
>>792729 Причем тут уебищный апи? Да, я с этим согласен, он уебищный. Но на данном этапе я хочу сделать дженерик класс, который бы этот уебищый апи к логгеру убирал бы от меня. Ты предложил сделать это темплейтами, но т.к. языка я по факту не особо знаю, то у меня с имплементацией этой задачи возникают проблемы.
Хидер:
template<typename T> class Logger { public: void d(char const TAG, T value); };
>>792775 >Ты серьёзно? Да. > Иди лучше книжку по плюсам хоть вертикально прогляди для начала. Нет. >>792779 typedef int jint; Так что тут ни в какую гадалочку играть не надо. Тип может вообще любой прилетать. Хоть jfloat который по факту float.
В идеале хотелось бы вообще иметь статическую функцию, которой похуй на то что я в неё пихаю и чтоб она красиво вызывалась как Logger.d(TAG, любой аргумент); Почему это блять так сложно?
>>792783 >нихачу учится, хачу хуякхуяк и в продакшен Захочешь как что-то сложнее шаблонной функции понадобится. >>792784 >c++98 Это вообще пушка. >>792787 http://ideone.com/4s3mwn Хуй знает есть ли в твоём прогнившем древнем говне вместо компилятора дедуктивный вывод шаблонов, если будут ошибки - подставь <int> перед скобками.
1. Если объявляю его как член класса, возникает ошибка "Оператор должен быть бинарным, но он принимает 3 аргумента". 2. Если объявляю как friend, то я не знаю, как правильно обратиться к его внутренним данным и типам для вывода списка.
>>792626 Я уверен, что имеется ввиду тип указателя, который возвращается при использовании имени массива или при использовании указателя на массив. Смотри скрин.
>>793119 >Читать умные книжки не пробовал? Да блять, я и так читаю Липпмана, но до нужной главы еще не дошел. Обычно мне хватало гугла для решения проблемы, но теперь я в тупике.
>>793126 Лучше используй cppreference, больше толку будет. Алсо, C4Droid (который у него в похожих) это годнейший порт gcc за авторством местного анона, рекомендую.
>>793360 Вот образцовый пример, глядите, посоны. Эти необучаемые вырожденцы не понимают даже, что от порядка термов зависит семантика, а вы хотите, чтобы они понимали кресты. Вероятно, подобно тому, как "годнейший порт gcc" волшебным образом мутирует у них на устах в "порт годнейшего gcc", многочисленные дефекты родительских умов превращаются в их собственные, только уже в реальности.
>>793912 >но в vs дебажить поудобнее Типа F11 удобнее жать, чем F6? Стабильность дебагеров одинаковая. Содержимое окошек одинаковое. Плюс lldb к тому же умеет в вызов функций прямо из дебаг-консоли.
Анон, помоги. В stl можно создать объект, и передать в него функцию и параметры. Например: auto t = std::thread(foo, 2); Как мне сделать такое для своего класса?
>>793856 Ебтвою мать. Я все понял. Конфигурация идет полностью через гредл, а не по старинке через android.mk и application.mk. Из-за этого ни мои либы ни встроенные либы не работали.
Ребята, поясните дауну за память. Например, у меня есть компуктер, есть код программы, записанный в файле temp.cpp код такой http://pastebin.com/7QVRuyL6
#include <iostream> using namespace std;
int main() { int *p = new int; return 0; }
Я, далее, использую g++ для создания исполняемого файла temp. Затем я запускаю программу. Что произойдет? Я не освободил память, теперь где-то в оперативной (оперативной?) памяти у меня 4 байта ебаные схавала моя прога? Навсегда? До следующего ребута? До завершения выполнения программы? Простите, я очень тупой, но хочу разобраться.
>>794149 почитай Таненбаум "Операционные системы". Небольшая книжечка - и всё понятно станет ( я ещё и на английском, помню, читал - один хрен всё понятно, слов не много используется )
>>794185 зависит от конторы, не плохо шарить хотя бы в stl, если пишут под винду - winapi,знать стандарты до с++14,могут задавать странные вопросы,еще про линуху
>>794333 Ну, очевидная причина - кто-то создает объект, которым потом пользуются из других мест и функций. Для этого используется куча и указатели на нее, потому что иначе пришлось бы лепить огромный ком из всех существующих данных и постоянно футболить его между функциями через стек, несмотря на то, что каждая функция использует ничтожную долю этих данных. Был бы каждый раз дичайший оверхед на копирование этого дерьма, проблемы с удалением чего-либо из середины кома, ну ты понел. Куча же позволяет схоронять данные на стороне, чтобы они не протухали и ждали своего часа, а доступ к ним обеспечивается через указатели.
Менее очевидная, но не менее важная причина - оптимальность. Даже если объектов мало, они могут быть большими, а размер стека часто довольно жестко ограничен (например, 1МБ, в который, например, не влезет массив уже из пары миллионов чисел). Если пихать такие данные в стек (например, передавая по значению), то стек может очень быстро закончиться и настанет пиздец. А куче доступна практически вся оперативная память, поэтому туда можно пихать все, не особо задумываясь о размере. А на стеке оперировать уже маленькими указателями-дескрипторами.
>>794449 >Ну, очевидная причина - кто-то создает объект, которым потом пользуются из других мест и функций. А как он может использоваться ещё где-то, если он unique?
>>794454 smart-pointer'ы привязывают время уничтожения объекта к стеку. Как и обычное выделение на стеке. Но стек довольно маленький (в macos, например, 8МБ) и на нем нельзя размещать все подряд. Поэтому мы выделяем память в куче, но время жизни привязываем к стеку.
>>794454 unique используется для задания владения, а не доступа. Ну вот представь, что у тебя есть дневничок, ты пишешь в него разную ебалу, а другие аноны ее читают и комментируют. Но владеешь им только ты, и только ты можешь принять решение снести его на хуй. Когда снесешь - никто больше не сможет его читать. В терминологии крестов у тебя бы был unique_ptr на дневничок, и ты раздавал бы анонам обычные указатели или ссылки на него, которые не дают права владения и могут протухнуть. Аналогично, если бы ты создал конфу, живущую до последнего читателя, то у всех был бы shared_ptr, и единоличного владельца бы не было.
>>794505 Ты только что описал weak_ptr. unique_ptr это, например, тебе заказали прокачать аккаунт в дотке. Тебе дают логин и пароль, изначальный владелец не может войти, пока ты играешь (ограничения стима). В один момент времени аккаунтом владеет только один человек. После того, как ты прокачал, ты отдаешь аккаунт обратно, чтобы тот играл в дотку.
>>794878 ABI - это не про это. Это про то, как растет стек, какой порядок бит используется, как передаются аргументы в функции и т.д. А как реализовать виртуальные функции - это забота рантайма C++
>>793787 Тут написано следующее. Костыли на си++ пишутся таким образом: 1) Ты создаешь класс. У него есть поля (переменные, структуры и т.д). А также методы. 2) Ты можешь поместить поля в протектед и теперь снаружи сможешь получать к ним доступ только через специально написанные для этого методы. Обычно они называтся геттеры и сеттеры (get и set) "Захуя все это нужно?", -- спросишь ты и совершишь большую ошибку, т.к. в тебе впервые закрались сомнения в адекватности си++-манямирка. Чем больше ты будешь изучать си++, тем более нелогичным тебе будет казаться то, как он устроен. Однако, релизигиозные фанатики будут продолжать тебя уверять, что это лучший путь жизни. Сектанты, хуле.
>>795035 Нет, судя по примеру там написано то, что доступ к переменным и методам можно получить либо через ., либо через -> с помощью переменной. Для доступа к типу, определенному в классе, надо использовать :: и имя класса.
>>795035 Сразу видно дебила, который ни разу не писал что-то большое на C. Там ты будешь заниматься абсолютно тем же, что и в C++, но руками эмулируя функции-методы наследование, полиморфизм и ограничение доступа к данным.
>>795035 >Захуя все это нужно? Потому что это логично. Инкапсуляция же. Данные должны изменяться ТОЛЬКО определёнными в классе методами. В Руби, например, вообще невозможно сделать доступные снаружи переменные экземпляра.
>>795110 auto - определенно стоит использовать, decltype тоже помогает, хотя реже. В основном, в шаблонах. >>795128 Это особенность работы decltype. Где-то я читал объяснение, что выражение в круглых скобках рассматривается, как lvalue, поэтому выводится тип как "ссылка на тип a". Хотя могу ошибаться.
>>795133 >>795136 Да, типа того. Ну и без auto ты никак не сможешь определить лямбду, потому что ее тип выдумывается компилятором самостоятельно. Ну и вообще удобно использовать в любом месте, чтобы не приходилось менять тип в сотне мест. Вообще, можешь посмотреть примеры использования в гайдлайнах от Страуструпа: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md
>>795139 >Ну и без auto ты никак не сможешь определить лямбду, потому что ее тип выдумывается компилятором самостоятельно. Вась, а ты уверен что как следует просмотрел доку?
>>794185 Студент из репортинг Дали анкету, 9 заданий, нужно написать их на листочке: Сумма цифр в числе Побитовый реверс числа Среди четырех миллиардов интов найти такой, который не встречается в массиве Среди кучи точек на плоскости найти те, которые образуют треугольник с макс периметром. Сделал вроде как все. Были еще задания, но я не помню их уже.
>>795305 Ты ебнутый? У тебя есть последовательность четырех миллиардов инстов и есть какой-то массив. Среди интов надо найти значение, которого нет в этом массиве. Если ты собрался искать значения, которого нет среди миллиардом интов, ты получишь бесконечное количество таких чисел, потому что множество целых чисел счетно.
>>795310 Я понял, что хуево написал условие. Тебе дан массив, размера 4 миллиарда. Ты должен вернуть такое число, которое не присутствует в этом массиве
>>795315 >Ты должен вернуть такое число, которое не присутствует в этом массиве Ебать дебил. Целых чисел бесконечное количество, а твой массив конечен. Поэтому можно вернуть дохуя чисел, которых в массиве нет. Например, любое целое число, которое не помещается в тип int.
Что за мрази дают такие тупые задания? Вас, дегенератов, надо всех через матфаки пропускать, чтобы учились давать четкие формулировки и не использовать термины, для которых нет однозначного определения.
Шифратор-Дешифратор на AES-128Кокопа13/07/16 Срд 18:38:04#399№795322
Ребзи, может кто раскидать как реализоваать весь алгоритм AES-а на пальцах желательно, знаю что за чем идет, но не знаю как применить и с чего начать
>>795299 >кажется хуяжется > В моём примере вывода типов нахуй не нужно, а вот ты ничего не обосновал за базар свой. Всем (кроме тебя) ясно, что там имелось в виду.
>>795310 Я так полагаю, что размер исходного массива - 2^32 - 1, тип всех чисел в массиве - uint32_t, и нужно найти число из множества uint32_t, которое не входит в изначальный массив. К тому же дают еще 2^30 байт памяти сверху?
>>795357 Отсортировать массив, найти два последовательных элементов массива, у которых разница > 1. Вернуть значение между ними. Если такого нет, вернуть элемент меньше минимального или больше максимального - смотря, что вылазит за границы исходного типа. O(n*logn) по времени, O(1) по памяти
>>795378 Тоже думал над этим, но O(n log n), при N = 4e9 это же пиздец. А что если генерировать рандомный int, а потом проверять на его наличие? Если все элементы различны, то шанс, что рандом не присутствует ~ 7%. Проверка за О(n) и скрытых констант нет, и массив не меняем (может его нельзя менять? в условии ничего не сказано было).
>>795391 Что ты несешь, поехавший? В быстрой сортировке худшее время определено, а статистические методы используются только для выбора опорного элемента, чтобы смягчить худший случай.
>>795342 >Поведение auto можно сымитировать с помощью вывода типа auto это и есть вывод типа > с помощью std::function std::function это не вывод типа, это type erasure
>>795379 prog.cpp: In function 'int main()': prog.cpp:30:2: error: expected '(' before '{' token { ^ prog.cpp:31:3: error: 'pushad' was not declared in this scope pushad ^
Анон, недавно у меня была книга про алгоритмы на графах с примерами на C++, а потом я ее потерял. Может, здесь кто-то сможет напомнить, что это была за книга? Все алгоритмы были реализованы в виде классов.
>>786424 (OP) Поцаны, какой поставить свжий компилятор, и как? Под шиндоус, дайте ссыль на мануал попроще
Проверяю местных экспертов.Аноним14/07/16 Чтв 04:58:38#428№795604
shared_ptr содержит джва указателя: указатель на отслеживаемый объект и на control structure. Последняя, в свою очередь, хранит счётчик shared-ссылок, weak-ссылок и опять же указатель на отслеживаемый объект.
>>795604 Предвидя "ко-ко-ко, контрольная структура ещё хранит указатель ни деструктор" и "ко-ко-ко, ещё может хранить сам объект в контрольной структуре": вопрос в том, зачем дублировать указатель на объект, а не в этом.
Вечер в хату, /pr/-анонимусы. Я студент не пиздите ногами, окончил второй курс, заодно пройдя курс крестов и явы в вузике. Второе понравилось сильно меньше, ибо если с крестами я писал код, и если он не работал, то я не понимал почему, пока не пороюсь на стаковерфлоу, а в яве я писал код, и не понимал почему он работает. Следовательно первый я пытался вылизать, и искал красивые решения, то во втором случае я просто клал мпх, и шел дальше. Вся моя практика ограничилась лабами, пусть их было и немало, и они были не уровня джавараша, а нормальные такие, строчек по тыщи 2 (игорь там написать с гуем на кьюти, например). Ну и препод по хардкору угорал, ибо сам на крестах собаку съел, и тимлид крестового отдела в мощной конторе. Ну ближе к делу: я решил связать будущее с цпп, хотя я понимаю, что можно и говна поесть на этом поприще (возможно понимаю не до конца, поскольку этот текст я пишу). Живу в дс, поэтому какие-никакие вакансии имеются на новичков, пусть и не оче много. Из "ачивментов": 1.Освоил курс сишечки, напару с к&р, поэтому в байтоебстве что-то понимаю. 2.Прочитал [spoler]страуструпа, что же еще[/spoiler], и александреску. 3.Немного освоил (буквально чуть) 11 стандарт, побаловался с лямбдами, и авто, всякие шаредпоинтеры и до этого из буста юзал. 4.Всякую банальщину по вопросам уровня "зачем нужен виртуальный деструктор" в 90% случаев ответить смогу. 5.Есть репозиторий (не на гитхабе, правда) с моими поделками, за код как для новичка не стыдно. Здесь палить не буду, ибо диванон-легивон.
Теперь вопрос: этого багажа достаточно, чтобы околачивать HR-ов по объявам на джуниоров? Или я где-то проебался? Заранее спасибо, ананасы.
Вожусь с пайпами, написал клиент и сервер, сервер создает пайп и ждет подключений, потом начинает общаться. Клиент подключается к этому пайпу (по имени), и в зависимости от ответов сервера выводит то или иное. Так вот, пока я настроил сервер на ответы в 1 (дефолт). Вся хуйня в том, что пайп проджолжает общаться с клиентом по алгоритму сервера, даже когда сервер перестал работать, даже когда я удалил экзешник, все равно клиент получает сообщения от пайпа, те же самые что я и прописал. Как это может быть?
>>795735 >>795721 Ну у тебя прям 11/10 блядь достоинства, охуеть вообще. Первые свои костыли я тоже еще в началке на делфи 6 сверстал, с гуем и шлюхами. Мне это HR-у говорить? Или что я на античате примерно в том же возрасте спамеры/реггеры/чекеры толкал? Нашел чем выебнуться блядь. И если сишечка не байтоебство, то где надо канонично байты ебать? В 86 асме? Охуеть вообще.
>>795783 > Мне это HR-у говорить? Лучше показывай свою коммуникабельность и готовность прогибаться qw/ адекватность/. Айчарихи вон пишут, что типичный программистишка не может понять женщину и заботиться о ней, поэтому они живут с программистишками ради денег или вообще выбирают манагеров. Демонстрируй харизму, двигай тазом, показывай, что ты НАСТОЯЩИЙ МУЖЧИНА. А мы будем дальше дома сидеть.
>>795795 CallNamedPipe(L"\\\\.\\pipe\\serverpipe", (LPVOID)bufferIn, 4, (LPVOID)bufferOut, 1, pBytesRead, 20000); И таких строчек около 4х, причем после КАЖДОГО вызова в баффер пишется 1. Это же синхронная фунция, значит, пайп которого вообще не должно существовать получает по 1 байту каждый вызов, где в клиенте может быть проблема?
>>795937 Не слушай этого пидора с codelite: >>795939 Это наш местный фанатик, навязывающий свою веру ньюфаням. Для вката используй что-то, что работает из коробки: qtcreator или clion. В качестве компилятора советую использовать clang, а не gcc. В clang сообщения об ошибках более понятные.
>>795604 Ну очевидно же. Разыменование делается обычно на порядок чаще, чем какие-то изменения, требующие доступа к управляющей структуре. Предположим, мы делаем только один указатель на объект. Если он будет только в управляющей структуре, то доступ замедляется сразу в джва раза из-за косвенности, а хотелось бы, чтобы скорость была как для грязных указателей. Если же оставить указатель на объект только в самом shared, то из управляющей структуры не будет видно, что там за объект, это дополнительно усложнит процесс удаления (придется вместе с запросом на декремент счетчика предлагать управляющей структуре в большинстве случаев не нужный указатель на объект, или делать коллбэки, или еще хуй пойми что). Вот и было принято довольно логичное решение пожертвовать несколькими байтами, тем более, что без оверхеда по памяти тут все равно не обойтись, пусть хоть по скорости будет как грязный. Такие дела.
>>796103 >Если же оставить указатель на объект только в самом shared, то из управляющей структуры не будет видно, что там за объект Доступ к управляющей структуре идёт через share_ptr, так что никаких проблем с получением указателя на объект нет.
>>796194 Без пруфов ты хуй простой, няша. Кококок виртуальность? Это уже вторично, в случае малейшего выигрыша по производительности могли бы сделать мономорфный shared с прямыми специализациями для дефолтных делетеров, всем поебать на архитектурку при реализации быстрых библиотек.
>>796393 Жил-был АНДРЕЙ АЛЕКСАНДРЕСКУ. У АНДРЕЯ всё всегда было через ЖОПУ. Мать АНДРЕЯ была наркоманкой. Список ее психических расстройств, венерических заболеваний и наркотиков, на которых она сидела, был длиннее типичного ресторанного меню. Когда пришло время рожать, каково-же было удивление врачей, когда АНДРЕЙ вылез из ЖОПЫ и каким-то образом умудрился убить и частично съесть двух медсестер. АНДРЕЙ был трудным ребенком. Когда АНДРЕЙ еще находился на лечении, на пятнадцатом году шоковой терапии и после второй лоботомии, он вдруг направил свое внимание на языки программирования. Большую часть дня, АНДРЕЙ бился головой о стену, пытался откусить кусок своего тела и ел свои экскременты. Но в перерывах между приступами, АНДРЕЙ листал книги и искал... Он прочитал про десятки языков программирования, но они не вызывали у него никакого интереса, потому что, они не были достаточно извращенными для его тонкого вкуса. Внезапно АНДРЕЙ увидел ВЫЧИСЛЕНИЕ ЧИСЕЛ ФИБОНАЧЧИ ВО ВРЕМЯ КОМПИЛЯЦИИ НА C++ и замер. В его уставшей, больной голове что-то щелкнуло - он нашел, что искал. Он начал читать книги по C++. Чем дальше он проникал в тайны C++, тем больше он понимал, что этот язык создан для него. Мерзкие извращения, которые он наблюдал на страницах, глубоко резонировали с его истерзанной и едко ненавидящей все светлое душой. Его глаза наливались кровью от удовольствия и слезы текли по щекам, от осознания, что на свете есть люди, не намного менее больные, чем он. АНДРЕЙ понимал, что скоро ему сделают третью лоботомию и тогда он вряд ли сможет написать книгу. Времени до третьей лоботомии оставалось немного и АНДРЕЙ решил начать писать книгу прямо сейчас. "THE TIME IS NOW, ANDREI", сказал он вслух самому себе на ломаном английском с выблядски кривым акцентом и начал писать. Вначале он не знал, в чем суть того, что он пишет. Но со временем картина стала ясной как день. АНДРЕЙ взял самый гнилой, уродский и омерзительный язык программирования и решил довести его до уровня сумасшествия, до сих пор невиданного в мире людей. Первый (и последний) технический рецензент его книги, сошел с ума и убил всю свою семью, после прочтения нескольких глав. Узнав об этом АНДРЕЙ смеялся, пока не потерял сознание. АНДРЕЙ понимал, что все идет как надо. Сразу после того, как он дописал последнюю главу, ему сделали последнюю лоботомию и писать книги ему больше не хотелось. Представители издателя взяли книгу АНДРЕЯ и, согласившись ее издать, спросили у него, как бы он хотел ее назвать. На ломаном, кривом английском он ответил: "MODERN C++ DESIGN: GENERIC PROGRAMMING AND DESIGN PATTERNS APPLIED BY ANDREI ALEXANDRESCU". Его акцент был настолько уебищен, что представители издателя начали ржать, с такой силой, что моча начала струиться по их ногам. Но, слишком поздно они поняли, что это была моча АНДРЕЯ. Они не знали, что таким образом он помечает своих жертв, перед тем, как их убить. АНДРЕЙ успел убить одного, но другому удалось спастись, хоть он и лишился уха.
Через несколько лет АНДРЕЯ выпустили. 20 лет шоковой терапии и 3 лоботомии, все-таки, смогли немного успокоить его. Он, конечно продолжал убивать, но редко, и в основном мелких грызунов.
Наступил обычный, скучный день. Скучным он мог быть для кого угодно, но не для АНДРЕЯ. Ведь у него диагностировали шизофрению еще на внутриутробной стадии. Книга продавалась не особо хорошо. В мире оказалось не так уж много запредельно больных людей, готовых ее купить. Уже 2 месяца у АНДРЕЯ почти не было денег и он ел блюдо собственного изобретения - ТУАЛЕТНАЯ БУМАГА ПО ФЛОТСКИ. Блюдо представляло собой собачий корм с вареной туалетной бумагой. Роялти с продаж книги капали ему на банковский счет, но очень вяло. АНДРЕЙ уже отошел от третьей лоботомии и решил взять дело в свои руки. Он положил в сумку с десяток экземпляров MODERN C++ DESIGN и пошел на улицу, с надеждой продать хотя бы несколько. Хотя бы один. Если это удастся, то наконец можно будет купить КЕТЧУП. Подумав о КЕТЧУПЕ, АНДРЕЙ улыбнулся, но повернувшись, чтобы открыть дверь, увидел свое отражение в зеркале. Выражение лица, которое получилось из за улыбки, было настолько ужасающим, что АНДРЕЙ отшатнулся. Он вышел на улицу и стал бродить по улицам. АНДРЕЙ увидел здание, в котором было множество компаний по разработке программ и направился к нему. Там АНДРЕЯ уже знали и вызвали охрану раньше, чем он успел войти. АНДРЕЙ удивился, потому что он никогда не был здесь. Из здания вышел человек и сказал АНДРЕЮ, чтобы он убирался. Человек объяснил, что однажды, один из программистов, работавших в здании, купил себе MODERN C++ DESIGN и принес на работу. Прочитав 5 страниц, этот человек обезумел и успел убить трех коллег, до того как натолкал себе в жопу скрепок и повесился в полностью пустом помещении. После этого, запятнанную кровью книгу, подобрал другой разработчик и цепь событий повторилась. Как вирус, книга распространялась по всему зданию. В результате этой бойни, 30 человек погибли ужасными смертями, перед тем, как кто-то сообразил, что нужно уничтожить книгу. АНДРЕЙ понял, почему его не хотят пускать, но решил попытать судьбу и все-же проникнуть в здание. С раззадоренным еблом, он попытался пробежать в дверь, но охранник ударил его дубиной по еблу, выбив несколько зубов, после чего добил по яйцам, пнув достаточно много раз, чтобы наблюдающие сбились со счета. АНДРЕЙ сполз с крыльца и потерял сознание.
Очнулся он уже под вечер. Первый опыт продажи был не очень удачен, но может во второй раз повезет? АНДРЕЙ шел по улице, страстно разговаривая сам с собой и вдруг увидел двух человек. Подсознательно он узнал их, но не мог вспомнить. Трясясь от страха он подошел к ним и предложил купить книгу. ПОЛ ГРЭМ и ПИТЕР НОРВИГ взяли его книгу и стали листать. Они поняли, с кем они имеют дело. АНДРЕЙ смотрел куда-то в сторону и незаметил первого удара, который пришелся по голове. АНДРЕЙ даже в начале не понял, что происходит, потому что били его как никогда сильно. Удары сыпались со всех сторон и, услышав хруст своих ребер, АНДРЕЙ осознал, что вероятно, живым ему не уйти. Это осознание ввергло его в истерику, но он ничего не мог поделать, кроме того, как обосраться и изваляться в собственном говне. Увидев это ПОЛ ГРЭМ и ПИТЕР НОРВИГ побрезговали добивать жалкого РУМЫНСКОГО барана и оставили его в покое. Грязно выругавшись, АНДРЕЙ поднялся и пошел по улице. Завернув за угол, он увидел СТРАУСТРУПА, стоящего на одном месте и напряженно о чем-то думающего. АНДРЕЙ осмотрелся, но не обнаружив потенциальных покупателей, развернулся и пошел домой, насвистывая РУМЫНСКУЮ НАРОДНУЮ ПЕСНЮ.
>>796420 Алсо, про Степанова: http://steps3d.narod.ru/tutorials/c-minus-minus.html > Не так давно я узнал, когда именно г-ну Степанову пришла идея библиотеки STL - когда он находился в отделении интенсивной терапии (после отравления рыбой) в, как он сам написал, "delirium state", по-просту - в состоянии БРЕДА. > Этот малеьнкий фактик очень удачно вписался в мои собственные представления об STL и самом языка С++.
>>796423 > Даже по сравнению с Java С++ явно в проигрыше - нет интерфейсов (зато есть множественное наследование со всеми его проблемами), объектная модель просто отсутствует.
>>796424 Только вот как понимать ОО - я не думаю, что программисты, пишущие на Smalltalk'е, сочтут С++ объектно- ориентированным языком. Даже по сравнению с Java С++ явно в проигрыше - нет интерфейсов (зато есть множественное наследование со всеми его проблемами), объектная модель просто отсутствует.
Понятие метаинформации (а также reflection, introspection и т.п.) в С++ отсутствует полностью (а вся среда Smalltalk построена на ней).
Много ли Вы знаете простых и удобных persistence-библиотек для С++, которые бы сами могли сериализовать произвольные объекты ? Максимум, что есть, это сложные библиотек с кучей ограничений и необходимостью вручную (зачастую при помощи макросов) задавать фактически часть метаинформации.
А вот в Smalltalk'е или в Python'е таких библиотек полно.
А как дела у С++ с интеграцией со скриптовыми языками - Perl, Python, Tcl, Ruby и др ? Опять же очень плохо - надо ручками задавать всю необходимую метаинформацию. Есть правда генераторы интерфейсов, которые разбирают Ваш исходный код на С++ и по нему строят необходимые описания.
Только это не всегда работает и почему это не может делать сам компилятор.
А вот Python умеет легко работать даже с такой кривой объектной моделью как СОМ, умеет сериализовать произвольные объекты, умеет на ходу добавлять объекту новые методы.
ООП хорошо подходило для сочетания двух условий - "у нас есть задачи дискретно-событийного моделирования" и "у нас есть Algol60 и больше нихуя". К Алголу60 оказалось очень легко прикрутить несколько полезных (для той задачи) хаков, которые (на тех компьютерах) еще и были дешевы в смысле скорости. Сначала они хотели сделать препроцессор (что логично - Страуструп через много лет тоже начал с этого и собирался этим и ограничиться), но им понадобились и некоторые другие расширения Алгола и ограничиться препроцессором не удалось.
И все эти "Концепции ООП" появлялись именно таким способом: вот интересный (и дешевый в реализации) эффект — как мы можем его использовать? Началось все с того, что понадобилось придумать новый (быстрый) способ передачи параметров в процедуры. Стандартные алголовские способы: по значению и по имени были медленными по разным причинам. Тогда Хоар изобрел ссылки и null. Раз уж структурная эквивалентность оказалось сложной в реализации, сравнивать стали адреса, по которым "объекты" располагаются — появилось identity. Обратили внимание на то, что блок памяти B, структурированный в начале так же, как и блок A можно обрабатывать процедурами, написанными для работы с A — появился "префиксинг" (даже синтаксически объявление класса родителя было префиксным), под который потом подвели идеологию и назвали "наследованием" (ну и понятно, почему сначала никаких "множественных наследований" не было — что такое "множественный префиксинг"?). К рекордам добавили процедуры, диспетчеризующиеся по одному аргументу. Почему именно по одному? Потому что по n > 1 — сложно в реализации.
Прекрасно решили свои задачи дискретно-событийного моделирования, на тех компьютерах что у них были, и успокоились. Но пришел Алан Кей и все испортил. Кей и прочие смолтокеры захотели сделать не такой вот "натянутый" на структурное программирование ООП, а идеологически чистый и непротиворечивый. Для этого они подвели базу под все эти технические срезания углов. Получилась чистая реализация идей, придуманных для быстроты и простоты реализации, только медленная и сложная. Они не смогли все это заставить вертеться с приемлемой скоростью до 90-х годов, когда стало уже поздно. Чтоб ввести Симула-лайк ООП в мейнстрим понадобилось только (временно) отказаться от сборщика мусора. Однако, вся философия и методология ООП, паттерны и юнит-тесты и т.д., придуманные смолтокерами не пропали, а были адаптированы мейнстримом.
Смолток — это не "изначальное древнее ООП", а возрождение умирающего старого и реформация неправильного ООП, загнувшееся, правда, раньше нем неправильное, пока по настоящему древнее ООП все продолжало умирать. Ну и, понятно, философия ООП, которая превратила все картины, загораживающие дырки на обоях, в "краеугольные камни" концепции и "имманентные особенности человеческого мЫшленья".
>>796433 Все это конечно очень интересно, но таки где ORM на крестах? Вот на Java есть Hibernate, на C# - тот же Hibernate и Entity Framework, на скриптовых языках свои ORM... А на крестах что у нас?
Или там сериализация/десериализация XML и JSON, как это можно сделать?
>>795604 Указатель в control structure нужен для weak_ptr. В shared дублируется, чтобы в control structure лишний раз не лазить. Там два атомика же, если из другого потока будут копию делать/уничтожать пойдёт синхронизация кешей процессора скорее всего, а это долго.
>>796515 Плюс control structure хуй знает где лежит ещё, может страницу памяти подключать придётся, а может она в свопе уже. А указатель в shared - вот он, тут, либо на стеке, либо и нак на активной странице памяти.
>>796515 >Указатель в control structure нужен для weak_ptr. weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же, в себе, и не лазать в control structure.
Соображения производительности, конечно, играют рояль, но только там, где один поинтер лежит в самом shared/weak ptr. Могли бы лежать два поинтера в control structure. Но их всё равно нужно было два. Иначе не получится зделать shared_ptr, удовлетворяющий стандарту.
Вот я и спрашиваю, зачем ДВА поинтера, неважно, где они лежат.
Посоны, поясните насчёт лицензий. Я взял файл с примером из одного SDK. Лицензия на этот пример мне неизвестна. Есть строка: Копирайт 201x год, Корпорация Икс.
Постепенно переписывал, переписывал и в результате там от исходного вида не осталось ничего общего, кроме #include'ов. Могу ли я такой файл выложить в сеть под свободной лицензией? Можно ли мне его выкладывать вместе с историей правок или сделать так, как-будто это первый коммит?
>>796674 Во-первых, если нельзя будет понять, что твой код основан на коде либы, то похуй. Если можно, то нужно знать исходную лицензию. Если она не указана, то ЕМНИП она - creative common.
Сап.Есть скрипт,скипающий всяких м/ж и т.п. в чат вдвоем.Решил я написать прогу,которая будет добавлять список слов в условия скрипта,получилось так,что нуль терминаторы мешаются.Например, " input ",вместо "input".Как это фиксить? http://pastebin.com/agcYEiij
>>796560 Реализация, где было бы рядом два одинаковых поинтера - это нонсенс и идиотизм. Если есть два абсолютно одинаковых однотипных поинтера, лежащие рядом, то нет никаких причин, мешающих объединить их в один. Чисто теоретически можно было бы допустить какие-то хитрые изъебства, связанные с кэшированием и подобной хуйней, но это именно что вопрос производительности, не имеющий никакого отношения к стандарту. А ты втираешь какую-то дичь нам и прикрываешься кукареками про икспертов. Эксперт это, блядь, не тот, кто высосал из пальца дрочильню и объявил ее сакральным знанием на основании того, что подобный бред просто не придет в голову никому.
>>796560 >weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же, в себе Не может. Суть weak_ptr в том, что он кроме разрыва циклических ссылок еще и предохраняет от dangling pointers. То есть объект, на который ссылались shared_ptr может быть уже убит, но control structure живет до тех пор, пока на нее указывает хоть один weak_ptr. Когда же weak_ptr пытается получить ссылку на убитый объект, он получает нулевой указатель, вместо указателя на порченную память.
>>796560 >weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же При создании да. А вот при уничтожении или создании shared из weak нет, нужен указатель, а у weak есть полько поинтер на структуру.
>>796560 В производительности дело же. Указатель в структуре по идее лишний, т.к. там атомики впритык, значит туда лазить может быть медленно. Но он нужен, чтобы из weak shared делать. Не было бы weak указателей - было бы по одному указателю в shared и всё.
>>796648 >Может кто-нибудь пояснить за c++ builder ? >Предлагают в одной говно-конторке работать на нем за еду
На Турбо Паскале за еду не предлагают кодить? О чём вопрос то? За builder, имхо, доплачивать должны, меньше чем за 120к в Россиюшке я бы его даже трогать не стал.
"иксперты" застряли в своём манямирке и всё пытаются убедить меня (точнее, себя) что дело только в производительности.
Ладно, вот вам ответ: shared_ptr может указывать на один объект, а управлять временем жизни другого. Поинтер, которым он управляет, лежит в структуре, а который он возвращает по get() или к которому обращается из оператора -> — в самом shared_ptr-е.
Зачем это нужно? Обычно приводят пример, что shared_ptr может хранить указатель на метод объекта, которым управляет. Или можно хранить указатель, полученный кастом управляемого объекта. Ведь поинтер после каста может отличаться, а освобождать объект по поинтеру, по которому ничего не выделялось нельзя.
>>797012 Блядь, да вы заебали. Потрать 2 часа времени и напиши свой shared без weak поинтеров. У тебя поинтеры будут в shared, а в структуре один счётчик. И на касты похуй же, какая тебе в попу разница к чему кастили, виртуальный деструктор должен быть же. Я в своём манямирке наебался во всеми умными указателями из буста, Qt и std на отлично, не надо тут всех дебилами мнить. Если не до конца понятно что-то - вопрос задай. Ещё раз, 8 алиасинг ничего не меняет. Ну скастил ты, ну один shared теперь с указателем на базовый. Что поменялось то? Удалит он также хорошо, структура у него такая-же. Да типы указателей в самом shared и структуре разные будут. И чё? Уже сказали тебе, что shared указатель для структуры не пользует, он для weak нужен.
>>797018 > И на касты похуй же, какая тебе в попу разница к чему кастили, виртуальный деструктор должен быть же. Ок, а с указателями на члены класса как ты предложишь поступать?
>>797020 Шо? Можешь развернуть свою мысль? На какие такие члены класса? При разыменовании то? Так и хули будут тебе батины члены. В смысле члены базового класса.
>>797012 Теперь осталось только объяснить, зачем weak_ptr хранит два указателя, гений ты наш на самом деле нет.
Я тебе скинул выступление, МАТЬ ЕГО, РАЗРАБОТЧИКА STL В MICROSOFT, где он говорит, что в первую очередь там два указателя из-за "zero-overhead access", а тебя такое-то ВРЕТИ.
>>797039 >Теперь осталось только объяснить, зачем weak_ptr хранит два указателя А ты настолько туп, что не можешь догадаться даже после моего объяснения? Затем же, зачем и shared_ptr: для aliasing-a.
>>797039 > выступление, МАТЬ ЕГО, РАЗРАБОТЧИКА STL В MICROSOFT > авторитет для меня всё, шевелить мозгами — ничто Ясно. Я и не спорю, что указатель, к которому shared_ptr обращается, хранится в нём ради производительности. Я говорю: даже если бы вопрос производительности не стоял, если бы aliasing pointer хранился в control structure, указателей там ВСЁ РАВНО БЫЛО БЫ ДВА, БЛЯДЬ. Один — на управляемый объект, который будет уничтожен при обнулении ссылок на него, а второй — который shared/weak_ptr возвращает из operator->()
>>797039 Хуя. А реально, зачем? Я не готов час этого чувака слушать. При создании shared один хуй в структуру лезть, а больше ни для чего указатель и не нужен же.
>>797046 >Один — на управляемый объект, который будет уничтожен при обнулении ссылок на него, а второй — который shared/weak_ptr возвращает из operator->() Зойчем? Почему один и тот же не пользовать?
>>797012 >Обычно приводят пример, что shared_ptr может хранить указатель на метод объекта, которым управляет. ШТОА????!!!! >Или можно хранить указатель, полученный кастом управляемого объекта. И похуй, delete и после каста отработает. А если ты его к жопе привёл - ССЗБ.
>>797063 >А на меня бочки катили, что я FILE в них пихал с каспомным делитером. Тут есть горстка ебанутых фанатиков. FILE им религия запрещает использовать, макросы им религия запрещает использовать… Хуже муслимов. Не слушай их.
>>797012 >"иксперты" застряли в своём манямирке Ебать ты олень, я тебе то же самое рассказал >>796719. Shared_ptr хранять данные, weak_ptr хранят управляющую структуру, и обнуляются при уничтожении данных.
Так-так-так, что тут у нас? Ой, да это же самая первая реализация связки shared_ptr + weak_ptr! Ой, а давайте посмотрим... Вай, да тут же, оказывается, нет aliasing constructor и при этом указатель на объект хранится и в счетчике, и в shared_ptr. Неужели это ты НЕ ПРАВ?
>>797076 Блядь... Это понятно, не понятно при такой логике нахуа в weak 2 указателя - на структуру и объект. По такой логике указатель на объект надо из структуры доставать только при создании shared из него.
>>797064 Религия такая вообще скорее добро и в сферическом мире розовых поней это всё верно. Но есть легаси, а там бывает 3 стула - пихнуть FILE в shared, писать свой RAII холдер (нахуа?) или руками освобождать (за что надо руки отрывать и разбивать ими лицо в кровавое месиво).
>>797081 Про "икспердов" писал я, этот >>797078 отвечает вместо меня. А что насчёт покаяния — хуй тебе. Я не отрицал роль производительности, я спросил, зачем для std:: (не boost::, идиот) необходимо два указателя.
>>797072 >В weak тоже поинтер на объект есть. Так что производительность - это типа сайд-эффект. Там в любом случае два дереференса, по стандарту - сначала получаешь shared_ptr из weak_ptr, потом уже данные.
>>797087 Дык, о чём и речь. И если речть только о >сначала получаешь shared_ptr из weak_ptr, потом уже данные то указатель на объект в weak нах не нужен. Один хер лезем в структуру при создании shared, чтоб и указатель оттуда не взять? А он есть, зачем он есть? Алясинг.
>>797073 >Главное, на пикрелейтед не смотреть Ты сам-то смотрел? Данные уничтожаются, когда счетчик shared_ptr обнуляется, control уничтожается, когда обнуляются weak_ptr. То есть данные могут уже быть уничтожены, но ctrl будет продолжать жить, и возвращать нулевой указатель при lock.
>>797092 > Данные уничтожаются, когда счетчик shared_ptr обнуляется, control уничтожается, когда обнуляются weak_ptr. Очень здорово, что ты это знаешь. Только к чему ты это написал?
>>797085 >Я не отрицал роль производительности, я спросил, зачем для std:: (не boost::, идиот) необходимо два указателя КАКИЕ МАНЕВРЫ. Маньке невдомек, что интерфейс std::shared_ptr попал в стандарт напрямую из буста и является его полной копией. И твой ссаный aliasing constructor пришел именно из буста. Конечно, aliasing constructor накладывает ограничение на реализацию shared_ptr, но не будь его, там там все равно было бы двойное хранение указателя. Потому что изначальная мотивация была - zero overhead. Я тебе больше скажу, aliasing constructor в таком виде появился именно из-за дублирования указателя на данные во внутренней реализации.
>>797092 >>797087 Речь о том, что при предложенном вами объяснении в weak должен быть только поинтер на структура, а там второй есть, на объект. Нахуа он в weak?
>>797012 Я >>796719-кун. Признаюсь честно, я не думал про псевдонимный конструктор хотя, конечно, знаю про него, когда обдумывал твои слова, так что ты отчасти прав, и это серьезная причина. Но я все же не уверен, что это важнее производительности, тем более, раз об этом говорит парень из STL-команды. Если бы производительность не играла никакой роли, то неочевидно, что комитет пошел бы на увеличение оверхеда ради этой весьма специфической и редкой фичи. Я не помню, были ли псевдонимные конструкторы в boost::shared, но есть подозрение, что они не планировались с самого начала, а просто удачно вписались в уже существующую реализацию с двумя указателями. Но это все уже, конечно, домыслы, так что энивей спасибо тебе за содержательную дискуссию. Обожаю крестотред как раз за такие споры.
>>797101 Я не >>797012 кун, но тут все правы. Указатель в структуре нужен для weak, в weak нужен для алясинга, в shared нужен для алясинга и производительности. Два зайца одним камнем и всё такое. А если бы не производительность, то да, скорее всего выкинули бы алясинг КЕМ и не тратили память ради редкоиспользуемой фичи.
>>797096 >Нахуа он в weak? Чтобы не делать лишних телодвижений, когда указатель на данные обнулится. Если он нулевой у weak_ptr, тогда можно сражу возвращать невалидный shared_ptr, не лазая в контрольную структуру.
Вообще, охуенно, что пошло такое бурное обсуждение shared_ptr. Хороший повод покурить их внимательнее, а то я поймал себя на том, что недолюбливаю их и все время норовлю построить жесткие иерархии владения на unique_ptr, а то и вообще иммутабельные. Эх, гибче надо быть.
>>797103 Может потому что... может... Не знаю даже... Может потому что у него есть get() и разыменования, которого НЕТУ БЛЯДЬ В СТАНДАРТЕ И ЭТО ЕДИНСТВЕННАЯ ПРИЧИНА, ПОЧЕМУ ОН ТАМ? Ой, чё-то я разорался, чтобы это понять надо же было самому глянуть на код, прежде чем ссылку кидать.
>>797106 Поинт коректный, если объекта нету - он не появится. Сетим указатель на объект в ноль и не лезем больше в структуру. Но почему не пользовать для этого указатель на структуру? Типа, если объекта нет, отцепляем weak от структуры (если мы последние - сносим структуру), сетим указатель в ноль и при попытке лока всегда возвращаем пустой shared. Не?
>>797117 Не доехало, плохо покаялся. Вот ведь мудак, да? Сначала жирно траллировал и поливал говном анонов, которые дело говорили, потом начал маневрировать, а потом оказалось, что он настолько ссыкло, что даже признать свою неправоту не может.
>>797122 >Не доехало, плохо покаялся Ты по привычке сразу проглотил, поэтому найти не можешь. > Сначала жирно траллировал и поливал говном анонов Я спокойно предложил ответит на вопрос. Когда пошли ответы про производительность, я объяснил, что даже если забить на неё, всё равно будут необходимы два указателя. Уточнил вопрос.
А говну вроде тебя везде поливание говном видится. Всё, иди нахуй, долбоёб.
>>797122 Няш, ну вот если я столь же пафосно расчехлю свой пак gotchas, то 99.9% анонов включая меня самого обосрется, и не по одному пункту, а я смогу злорадствовать. Но бугурт не отменит полезности, каждый узнает что-то новое для себя. Так же и здесь, тебе дали пищу для размышления - разве так важно, в какой форме?
Чем отличается указатель от ссылки? Ссылка сетится один раз при инициализации. В ссылку нельзя пихнуть nullptr (ну то есть технически можно, но за такое побьют).
>>797109 Да, затупил. Вот он >>797114 правильно говорит. Он там нужен для aliased shared_ptr. >>797120 У shared_ptr есть конструктор, который позволяет ссылаться не на сам объект, а, напрмер, на его члены. Тогда weak_ptr будет указывать не на сам объект, а куда-то еще, но ссылки будут обнуляться у самого объекта.
>>797133 >У shared_ptr есть конструктор, который позволяет ссылаться не на сам объект, а, напрмер, на его члены. Я в курсе, я о том, что >Чтобы не делать лишних телодвижений, когда указатель на данные обнулится не причина для второго указателя, т.к. для этого можно сделать как я писал.
>>797130 Я пока еще не отсортировал пак, хотел в следующих тредах начать вбрасывать понемногу. Скажем, вот для затравки: http://ideone.com/uTBv1S Легальный ли код по стандарту? Если нет, то почему, если да, то что происходит в нем? Если до бамплимита не разделаетесь, то перекатите ссылку в новый тред, будьте няшами, а то меня не будет завтра.
>>797132 Обожаю задавать этот вопрос экспертам, которые меня собеседуют. Обычно после этого от тебя отстают с виртуальными деструкторами и сортировкой пузырьком и начинается ламповая беседа про любимый язык.
>>797132 Ссылка это не объект, а указатель объект. Соответственно все несколько сотен утверждений стандарта, верных только для объектов, образуют различия.
>>797144 А да, еще не математики для указателей, но это я уже загуглил, так что не считается. >>797149 >>797151 > What is a reference? > It's an alias for an object - another name by which it can be called. The implementation is frequently identical to that of pointers. But don't think of references as pointers - a reference is the object. Нахуй идем, победители?
>>797154 >But don't think of references as pointers - a reference is the object Сам иди. Имеется в виду, что ссылка - это объект на который она ссылается. Typeof ссылки вернёт тип этого объекта. sizeof вернёт размер объекта, а не ссылки. Попытка взять адрес ссылки вернёт адрес объекта.
>>797159 >>797160 >>797164 Ну раз мы любим заковыристые вопросы, так ответьте, почему нельзя взять ссылку на ссылку, если внутри это указатели. Если это действительно указатели, то тогда должно быть все ок, но оно не ок. Если ссылка это the объект, то ссылка на ссылку должна вернуть ссылку на объект. Время пошло.
>>797167 >почему По стандарту, маня. Разрешено делать только то, что явно разрешено в стандарте. В стандарте говорится только о ссылках на объектные типы, сами ссылки не являются объектными типами. Поэтому ссылки на ссылки неявно запрещены, как и бесконечное число других невалидных конструкций.
>>797167 >внутри это указатели Для кодогенератора в компиляторе - да. Для программиста - нет. >ссылка на ссылку должна вернуть ссылку на объект int a; int& b = a; int& c = b; c - ссылка на a. Если b протухнет, c останется валидным.
>>797167 >ссылка на ссылку должна вернуть ссылку на объект Так и есть, это явно оговорено. Но возможно только при выводе аргументов шаблона или синонимов, в остальных случаях ты чисто технически не сможешь написать такое, ибо упомянутая ссылка сразу воспринимается как referenced тип.
>>797173 То же самое можно сказать и про указатель. Просто указатель приходится разыменовывать.
>>797176 Там идет схлопывание ссылочных типов, а не вывод ссылки на ссылку. >в остальных случаях ты чисто технически не сможешь написать такое потому что дяденьки сказали, что так нельзя.
>>797184 >работает В спорах о дебрях стандарта это очень слабый аргумент, ибо прямо сейчас в каждом из компиляторов сотни непофикшенных багов. По факту ни один стандарту полностью не соответствует.
>>797180 >Вооот, так и сразу говори - потому что по стандарту дяденьки придумали, а не потому что ссылки это the объект. Ссылки по стандарту the object, маня, ты о чём? Ссылка - не указатель и никоим боком с ним не связана. То что компиляторы генерят похожий код в некоторых случаех говорит тебе только о деталях имплементации компилятора, больше не о чём.
>>797189 >Ссылки по стандарту the object, маня, ты о чём? Я что-то говорю против? >То что компиляторы генерят похожий код в некоторых случаех говорит тебе только о деталях имплементации компилятора, больше не о чём. Вот об этом я и говорю. Теоретически, ссылки это не указатели, но фактически - указатели. Поэтому запрет делать ссылки на ссылки и архивы ссылок исходит только из стандарта (т.е. потому что так придумали), а не потому что по факту так нельзя.
>>797196 >>Поэтому запрет делать ссылки на ссылки и архивы ссылок исходит только из стандарта (т.е. потому что так придумали), а не потому что по факту так нельзя. Сам понял, что сказал? А из чего ещё оно может исходить? Если бы в стандарте было написано, что ссылки можно ебать, если им есть 18, то производитель компилятора должет хоть как извернуться, но поебушки обеспечить и будет ссылка не указателем, а тнёй. От того что указатель под собой имеет просто 64 битное число ты же не думаешь о нём как о простом числе. Это абстракция, ёбана. Поведение её описано в стандарте и никого не должно ебать, как она реализована внизу. Понятно, что знать это хорошо для системного понимания и возможности делать какие-то оптимизации, но по части философии - всё как в джаве: тебе описали поведение, а как уж реализованно - не ебёт.
>>797200 Что нету ссылки на ссылку. При взятии адреса ссылки даётся адрес объекта. Хотя адрес у неё где-то там есть, но без грязного хака его не достанешь. Сам хак: http://ideone.com/hJtNfa
>>797203 Цитата из стандарта: > 5 There shall be no references to references, no arrays of references, and no pointers to references. Вот ответ. А не потому что ссылки это не объекты.
>>797208 >>797212 Да, уже увидел, что схлопывание ссылок происходит и при синонимах.
>>797214 > 5 There shall be no references to references, no arrays of references, and no pointers to references. >Вот ответ. А не потому что ссылки это не объекты. Ссылки не объект, поэтому стандарт и запрещает.
>>797219 Все с тобой ясно. Весь тред доказывает, что ссылки на ссылки нельзя создать, потому что ссылки это не объект, и тут ему показывают, что ссылку на не-объект можно таки создать по стандарту.
>>797222 Блядь, потому что она похожа на объект, но не объект. Если бы ссылка по поведению была похожа на функцию, тебе бы доказывали, что адрес на неё нельзя брать, потому что это не функция. Утырок, ты чего к формулировкам докапываешься? Ты действительно не понял, что тебе сказать хотели? Или тебе просто нравиться поебываться до людей пока нахуй не пошлют или пока не начнут определениями из стандарта разговаривать?
>>797230 Это ты уже перестал понимать тот факт, что ссылки на ссылки нельзя создавать, не связан с тем фактом, что ссылка не объект или похожа на объект.
>>797234 Вот представь себе стандарт. Дилдо не острое, можно пихать в жопу. Нож острый, нельзя пихать в жопу. Вопрос, почему нельзя пихать нож в жопу? Потому что стандарт или потому что острый? Технически оба ответа правильные, но мы говорим о втором, потому что ответ ПО СТАНДАРТУ в обсуждении не нуждается, утырок.
>>797236 Тебе снова повторить ответ? Ок: >There shall be no references to references, no arrays of references, and no pointers to references. Опять же, функция не является объектом, однако ссылку на функцию можно создать. Ответ про не-объект - неправильный.
>>797237 И тут ты такой приходишь и говоришь, что язык тоже бывает острый, но его пихать в жопу можно, значит нож нельзя по стандарту, а не потому что острый. Ты правда думаешь что это строчка из стандарта никак не связана с тем, что ссылка не объект?
>>797245 То есть твое объяснение это то, что функция как бы объект, а ссылка не объект? Прости, я не умею интерпретировать предложения, которые написаны в припадке. Сформулируй себя нормально, и может быть я тебя пойму.
>>797247 Дай тут закончить дело, в интернете кто-то неправ, а тащить это в новый тред не хочется.
>>797249 Функции - это вообще отдельные сущности, которые ни к ссылкам, ни к объектам отношения не имеют. Прикол с ссылкой в том, что это не объект, как многие думают. То есть изначально такой прикол с ссылкой. Она чем-то похожа на объект, но не объект. Поэтому в стандарте запретили всё что ты перечисляешь. А была бы объектом - скорее всего не запретили бы. Про функции речи не шло вообще, что ты про них вспомнил то?
>>797254 Функции я приплел к тому, что они одного порядка со ссылками - они тоже не-объекты, но энтити. Твой тезис - нельзя создать ссылки на не-объекты. Этот тезис неверен.
>>797267 Да ты что? Правда? http://ideone.com/ULSI5n Иногда он есть, как в http://ideone.com/hJtNfa А иногда и нету, если компилятор знает адрес объекта на этапе компиляции (какая-нибудь локальная переменная на стеке) то может и не быть, да.
>>797275 >>797273 Ладно, неправильно выразился, от ссылки тоже можно взять адрес, который будет совпадать с адресом объекта. То есть операция взятия адреса тут тоже не связана с тем, что ссылку на ссылку нельзя создать.
>>797278 >То есть операция взятия адреса тут тоже не связана с тем, что ссылку на ссылку нельзя создать. Как это не связана? Потому, в практическом плане, и нельзя что адрес от ссылки - это адрес объекта.
>>797284 В общем, признай, что ты сам ничего не знаешь, Джон Сноу. Ссылки на функции возможны, только потому что разрешены стандартом: >A reference shall be initialized to refer to a valid object or function. Ссылки на ссылки невозможны, только потому что это не разрешено стандартом. Какого-либо логического объяснения тут нет. А я пошел.
>>797335 Когда понадобятся - тогда и накатишь. Особенно учитывая что часто это нетривиальный процесс. Рекоммендую спиратить Visual Assist. Подсветка кода и автодополнение в разы лучше, чем у студии. Алсо, сам плюнул на VS через пару лет использования и пользую Qt Creator. Qt изкаробки, можно проверять код и MS компилятором и gcc изкаробки (а учитывая, что gcc строже - это таки плюс). Формошлёпка лучше. Если судьба на лялих занесёт для тебя ничего не поменяется.
>>797341 >Подсветка кода и автодополнение в разы лучше Как там, в 2010? В 15 студии не покрывается ну максимум треть фич ассиста, а тормозит он по-прежнему. Гораздо лучше добить эту треть ортогональными микродополнениями, каждое про одну фичу.
В /gd/ полтора анона, поэтому спрошу здесь. Допустим, у нас есть игра. Коммуникация клиент-сервер идет через свой tcp- или udp-протокол. Как сервер идентифицирует пакеты клиента? Например, в играх на http и ws к каждому запросу прикрепляется session id. Но как это делается на более низком уровне? Со времен читерства помню, что в diablo 2 пакеты были чистые и не содержали никакой сессионной информации. А в пакетах lineage 2 и wow было несколько байт, которые постоянно менялись. Что-то вроде ключа, хитро ксорящегося после каждого пакета. В любом случае сервер должен как-то сопоставлять пакет с сущностью юзера. Неужели это определяется тупо по сокету? И аттакер мог бы совершать действия за другого юзера, имея его айпи и зная порты?
>>797799 Быстро глянул, там ничего не сказано про безопасность. А по структуре пакета понятно, что ее нет. Я сейчас вспомнил про ассиметричное шифрование. Но почему тогда оно не было применено в таких крупных играх? Видимо, слишком большой оверхед.
>>786424 (OP) Привет, крестач. Решил попытаться освоить кресты, точнее начать уже практическую часть освоения этого языка, но просто встрял на настройке среды как таковой. Я уже, наверное, неделю ебусь с правильной установкой cygwin'а. Подскажи, анон, как правильно накатить cygwin чтобы netbeans его видел полностью, а то у меня make и debug не вылезают. Гайды пересмотрел, по ним все делал - все тлен. Есть ли альтернативы для писания кода с меньшей степенью ебли при установке?
>>797664 Он тебе говорит, что если не происходит переполнение, то (X - c) > X всегда false. Может у тебя строкой выше что-то типа index = mSize - 1 и он на index > mSize ругается, как на бессмысленное? Покажи функцию целиком.
Быстровопрос, есть функция, считывающая arg_2 символов по char . Что передать, чтобы считывало с 10го символа? char parray = new char[1000]; abstract_read(parray, 10); abstract_read(&array[10], 10); //shit code here
Как в clion дебажить дочерний процесс? Я пробую так: на брейкпоинте выше форка кидаю в gdb set follow-fork-mode child, но когда дохожу до fork(), получаю пиклейтед. Анон, как пофиксить?
Стандарт C++ распух до неприличия - а многих действительно важных вещей нет до сих пор. А многих, таких как простого менеджера зависимостей и сборки, не будет никогда. Поэтому С++ со временем выдавят. На это уйдёт куча времени, но его место займут другие языки. Что забавно, С, думаю, останется сильно дольше - т.к. он гораздо проще. Осталось только добавить поддержку в Rust'е импорт C headers из коробки. После этого "два крестика" покатится cо всё нарастающей скоростью.
В общем, посмотрел, что тут всем советуют писать калькулятор, а делать утром было нехуй. Кресты начинал учить ещё прошлым летом, но забросил нахуй из-за учёбы. Вот вполне работающий код с костылями: #include "stdafx.h" #include <iostream> #include <cstdlib> #include <Windows.h> #include <cstdio> #include <cstring> #include <cctype> #include <conio.h> #include <process.h>
using namespace std;
int main() { setlocale(LC_ALL, "Russian"); setlocale(LC_ALL, "ru_RU.UTF-8"); setlocale(LC_ALL, ""); { typedef unsigned long int uli; typedef long double ld; ld num, a, b, c; uli x, y, z; main_menu: cout << "Введите число, соотвествующее командам, представленным ниже:" << endl; cout << "1. Сложение." << endl; cout << "2. Вычитание." << endl; cout << "3. Умножение." << endl; cout << "4. Деление." << endl; cout << "0. Выход из программы." << endl; cin >> num; if (num == 1) { cout << "Введите первое слагаемое:" << endl; cin >> a; cout << "Введите второе слагаемое:" << endl; cin >> b; c = a + b; cout << "Сумма слагаемых равна: " << c << endl; goto main_menu; } else if (num == 2) { cout << "Введите число, из которого будем вычитать:" << endl; cin >> a; cout << "Введите вычитаемое:" << endl; cin >> b; c = a - b; cout << "Разность равна: " << c << endl; goto main_menu; } else if (num == 3) { cout << "Введите число, которое будет умножаться:" << endl; cin >> a; cout << "Введите число, на которое будет умножаться первое число:" << endl; cin >> b; c = a * b; cout << "Произведение чисел равно: " << c << endl; goto main_menu; } else if (num == 4) { cout << "Введите число, которое будет делиться:" << endl; cin >> a; del: cout << "Введите число, на которое будет делиться первое число:" << endl; cin >> b; if (b = 0) { cout << "На ноль делить нельзя! Введите второе число заново." << endl; goto del; } else { c = a / b; cout << "Деление дало результат: " << c << endl; goto main_menu; } } else if (num ==0) { exit(0); } else { cout << "Число введено неправильно! Попробуйте ещё раз." << endl; goto main_menu; } } system("pause"); return 0; }
>>804135 менеджер зависимостей и сборки хотят прикрутить уже сейчас. В 17 стандарт не вошёл, печаль, но он будет. А Майкрофост уже пилят свой велосипед без стандарта. Rust не взлетит, потому что он по большей части решает те проблемы C++, которые уже не особо актуальны.
>>805493 Так говорю же, забросил изучение крестов, остановился на массивах и строках в книге Шилдта (там про функции начиналась глава). Вот и решил что-нибудь простенькое для себя написать, чтобы освежить память.
>>786598 >Vim/Emacs Я ньюфаня и я сразу, не дробя, начал хуярить упражнения в терминале, юзая gcc и vim. Собсна, а зачем мне переключаться между окнами, если можно этого не делать? Алсо, в таком случае не понимаю, почему и зачем под LINUX уже успел появиться Visual Studio, причем официальный? Тут ведь своих средств разработки хватает, хуле мелкомягкие сюда лезут?
>>786424 (OP) Господа кодеры, вопрос такой: существует ли в нашей вселенной книга/гайд/видеокурс/блог/етц, в котором бы не тупо объяснялся синтаксис языка, а в процессе обучения пилился бы некий более менее реальный проект и давались более менее серьезные задачи?
Все "самоучители" следуют одному шаблону: объяснение синтаксиса - коротенькие примеры кода - опционально еще более короткие задачи для самостоятельного решения.
В чём разница между Qt 5.5 (700+ метров) и Qt Creator 3.5 (80 метров)? Какой качать своим говноинтернетом, чтобы и консольные приложения кодить и ГУИ когда нужно?
я не могу использовать class A { int x; public: static A operator+(const A&, const A&); };
и вообще, почему нельзя определять static-операторы? С английским тяжело, помогите пожалуйста. Что-то я и сам понял, т.е. для второго варианта со static'ом допустимо такое выражение A x, y, z; x.operator+(y,z)
тогда да, вообще не ясно что складывать. Но однако черти, по ссылке вверху написали дофига, если ты еще подскажешь мне причины сего факта.
Сап крестач, вопрос вам задает ньюфаг: Есть функция в длл, и есть функция в другой длл нужно сделать указатель на функцию используя GetProcAddress проблема в том, что вот такой вот вид,: origComputeTgtPosition = (bool ( CEGun::)(Vector& vec)) GetProcAddress(GetModuleHandle(TEXT("Common.dll")), "?ComputeTgtLeadPosition@CEGun@@QBE_NAAVVector@@@Z"); приводит к ошибке невозможно преобразовать "FARPROC" в "FireResult (__thiscall CEGun:: )(const Vector &)" Говорили что то про касты, читал про typedef и указатели, но никак не могу применить к этому примеру.
Поскольку в шапке приведенные учебники описаны как говно, спрашиваю тут: я имею опыт коммерческой разработки на Java, JS, PL\SQL и PHP, игрался со всякими питонами, го, руби, неплохо разбираюсь в паттернах, прошивки для контроллеров на ASM писал и т.д. Короче, программировать более-менее умею и сейчас хочу наконец нормально освоить плюсы, заброшенные после универа. ЧЁПОЧИТАТЬ, чтобы освоить их как технологию, без всяких нравоучений о том, какое сложное устройство этот MP3-плеер и какую важную роль компьютеры играют в нашей жизни?
>>786424 (OP) Иногда один С++ заебывает, хочу почитать для развития что-нибудь про алгоритмы и организацию самих железок. Есть что-нибудь для ньюфагов, но без воды?
Жаваблядям - капут
Питонисты рыдают
И дотнет не спасут
Тьма нахлынет за тьмою
Из восставших степей
Морем мора накроет
Стадо жирных свиней
Их телами украсит
Все столбы фонарей
Кровью лиспер окрасит
Их отравленный Рейн
Вопреки Откровенью
Вряд ли выживет треть
Языкам их - забвенье
И их паттернам - смерть
На потеху сиблядям
Их прогресса плоды
Нет того, что могло бы
Спорить с мощью орды
Старший брат:
Предыдущий:
TL;DR
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать?
Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли?
A: Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешние сервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов
простреливания ногирешения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел!
A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него!
A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполне возможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад!
A: Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Эти фичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать?
A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Best practices
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все:
Проектирование
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Кроме того, на ангельском доступны стандарты C++11, C++14, а также последняя версия черновика стандарта C++17.
Тонкости языка
Книги для тех, кто возлюбил кресты всей душой и желает углубиться в детали:
Отдельные аспекты
Читать по необходимости:
и других фич последних стандартов
для разработки многопоточных приложений
остальным частям стандартной библиотеки
язык программирования, чтобы ты мог
программировать, пока программируешь"
в ужас даже исходники boost::MPL
на C++. Для его чтения не нужно знать
мертвые языки, в отличие от этого вашего Кнута
https://goo.gl/yDuQgG (часть 5)
Другие обучающие материалы
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс: раз, два, три
Q: Не люблю, когда льют воду. Хочу коротких материалов по существу.
A: Вот тебе блоги, факи, референсы и всякое такое:
Софт и библиотеки
Q: Я готов начать погроммировать! Куда мне писать код?
A: На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
https://goo.gl/WIPW9L (ангельская версия)
"sudo aptitude install codelite codelite-plugins"
для установки под *nix
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использовать текстовый редактор в связке с каким-нибудь компилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу!
A: Без проблем:
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы?
Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать?
A: Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Литература:
Qt
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Литература:
https://goo.gl/toUDWc (исходники примеров)
https://goo.gl/qpkZFm (книга) +
https://goo.gl/LIIECh (исходники примеров)
Другие хорошие библиотеки
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
И еще куча библиотек на любой вкус.
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше?
A: Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Предыдущие треды на архиваче
Старые ненумерованные треды
Отдельные Qt-треды