Двач, подскажите, есть ли такой контейнер что-бы можно было задать ему фиксированный размер и вставлять в него элементы с одной стороны, а с другой что-бы они смещаясь по очереди вылетали?
>>1693083 Врядли точно такое есть. Только свой навернуть. Можно на основе вектора. Сохраняешь индекс последнего добавленого элемента (он же начало). При добавлении - инкрементируешь индекс и заменяешь текущий элемент вектора на новый. Если дошел до конца - начинаешь снова с нуля. Ну и нужно operator[] продумать - вычислять индекс исходя из текущего смещения, учитывая границы массива. Вообще очень похоже на кольцевой буфер - но для буфера заполнение это гроб, кладбище, пидор и надо разгребать. А у тебя нрмальный режим работы.
Привет, анон. Возможно ли реализовать односвязный список без проверки при создании каждого нового узла списка, не первый ли он? Мой внутренний байтоёб не даёт мне покоя, пожалуйста, помогите.
Двач, делаю свой класс наследуясь от array, но при создании объекта нового класса в конструкторе не работает initializer_list. https://pastebin.com/QB5TRuHz Подскажите плиз, тема нихуя не простая, примеров нет, а что делать не ясно.
>>1693179 >сделай конструкторы. Для твоего нового класса определен только дефолтный конструктор using std::array<T, N>::array; Разве это не наследует все конструкторы?
>>1693182 Вот даже цитата из вики If the using-declaration refers to a constructor of a direct base of the class being defined (e.g. using Base::Base;), all constructors of that base (ignoring member access) are made visible to overload resolution when initializing the derived class.
Добавил наследование для своего класса от QObject, чтобы сигналы работали: class Layer : public QObject После этого в инициализациях этого класса стали появляться ошибки о неявно-удаленном копи-конструкторе. Как это понимать? Я ничего не удалял. Например: Layer currentLayer = layers[index]; Пишет: ошибка: call to implicitly-deleted copy constructor of 'Layer'
Объясните пожалуйста начинающему долбоёбу, зачем автор урока использует суффиксы если он уже объявил тип? Нахуя нужна эта сраная "f" в конце если уже указано, что там float? Типа если суффикс не указать, будет какой-то не такой float? А если такой, то вопрос тот же - нахуя эти суффиксы в таком вот виде?
>>1693200 По умолчанию X.X вроде double даёт, поэтому будет неявная конвертация. В данном случае суффиксы нахуй не надо, но уж не знаю где, но где-то потом может всплыть проблема.
>>1693205 >>1693210 То есть грубо говоря компилятор такой "а похуй что там этот хуй указал, ну написал float, да мне насрать, буду считать что это double"? И суффиксом мы ему уточняем, что это точно float. Типа без суффикса ему мало?
>>1693216 Так лол, там в примере на скринах уже указан тип. Это же не как в го, где := написал и оно само определило что там за тип. Здесь конкретно написано, что переменная fValue это float. Не double, не ещё что-то, а именно что float. То есть мы это указали. Если бы мы захотели, чтобы переменная была double мы бы написали double. Но мы написали float. У меня именно это вопросы вызывает.
>>1693223 Тебе уже 5 раз написали float x = 1.0; // компилятор компилирует неявную конвертацию во float т.к. значение 1.0 является double а тип данных куда это значение будет присваиваться является float float x = 1.0f // компилятор нихуя не делает т.к. значение 1.0f уже является float Хотя с оптимизацией компилятор вроде как в любом случае делать нихуя не будет
>>1693229 Хорошо, я даже не буду спрашивать нахуя это надо и почему бы просто не сделать так, что если ты указал float - это будет float без всяких неявных конвертаций. И double будет только если ты укажешь, что это double. Раз сделано значит умные дяди решили, что надо. Спасибо.
То что справа это временный объект и временный объект будет таким каким ты его там описал, с таким-же типом данных и таким-же значением, а технически без конвертации разные типы данных нельзя друг в друга записывать. Поэтому значение double обязано и будет конвертироваться во float. Временное значение - https://en.cppreference.com/w/cpp/language/lifetime
>>1693231 > почему бы просто не сделать так, что если ты указал float - это будет float без всяких неявных конвертаций Последнее что я добавлю для полной ясности float a = 1.0; В данном случае ты указал float для своей переменной, она и будет float, но правое значение это double, а как я уже сказал разные типы данных не могут быть записаны друг в друга, поэтому конвертации не может не быть.
>>1693081 (OP) Сап, анон. Есть параметрический класс, я на вход проги получаю тип , через свитч-кейс перебираю способы вызова параметрической функции, параметр которой собственно передается в параметр класса. Есть ли какой-то более элегантный способ, кроме как свитч-кейс?
>>1693593 Не разницу в том как они устроены и внутри, это я понял. А в том какую когда дучше использвать. Они почти одинаковые. Единственное перебирать упорядоченное множество иногда удобнее
>>1693599 set - когда не очень много элементов и операции сравнения будут быстрее чем взятие хэша от элемента. unordered_set - когда дохуя элементов. Я по крайней мере стараюсь так юзать.
>>1693593 В гугле забанили? Set - это всегда отсортированный массив (под капотом там red-black tree) с неповторяющимися значениями. Если это сэт структур/объектов, то ты решаешь по какому полю структуры будут неповторяющиеся значения. Unordered_set - тоже самое, только эта структура данных позволяет хранить повторяющиеся элементы, в отличие от сэта. А вообще, если ты не смог ТАКОЕ нагуглить, то земля пухом, анонче.
>Напишите программу, которая просит пользователя ввести число от 0 до 255. Выведите его как 8-битное двоичное число (в парах по 4 цифры). Не используйте побитовые операторы.
Вот это хтоническое нагромождение говна реально самый простой и правильный вариант решить эту задачу? Разве через кучу if else не проще? Мне просто в голове пока ещё трудно держать такой громоздкий алгоритм как тут. Стоит биться башкой в эту задачу пока на 100% её не пойму?
>>1693882 Что такое reverse я ещё не знаю, но сама часть с вычислениями выглядит проще Правда я не люблю использовать оператор +=, а предпочитаю писать это в полном виде
Есть какие-нибудь сайты или сборники упражнений по плюсам с градацией по сложности (начиная от самых лёгких уровня хелло ворлд)? А то я чувствую, что практики мне нужно раз в десять больше чем предлагают эти уроки или в голове у меня нихуя не отложится
Анон, а как тру пацаны хранят id какой-нибудь сильносоздаваемого говна, пусть будет например идентификатор события убийства игрока в сетевой игре? Int мне кажется маловат. Какой-нибудь guid + хеши для map?
>>1693934 Codewars выглядит именно как то, что нужно. Раздражает правда, что там надо каждый раз нажимать kata, выбирать сложность, выбирать упражнение, и нет возможности просто решать их подряд одно за другим
Сап, анон. Прочитал про REST, захотел к своей хайлоад-проге прикрутить няшную мордочку, чтобы веб-сервер делал к ней запросы (формат типа шттп, ответы - жсон, сильно ограничить большое количество запросов), потом хуячил вебомагию, а уже к серваку коннектились пользователи. И я не знаю приемов и апи, как это всё правильно делать. Изи изучить язык и поведение, и как-то не изи собрать этот вебопаззл. Например, сервер апач, в нем что там, питон-скрипты? А вся красота на js на страничке? А есть что-то красивое из коробки?
Второй вариант - подключить Qt + qml, оно проще, но платно и не веб
Анчоусы, когда определяют класс, чисто стилистически следует ли писать отдельно поле private? А то у меня привычка делать, например, такое : class RandomClass { // private members public: // public members };
Зная, что неявно поля класса имеют модификатор доступа private... Нужно ли явно указывать энивей или так норм?
>>1694445 вкусовщина, но мне персонально больше нравится классика. сначала паблик, а потом прайвет, т.к. интерфейс должен быть выше, чем детали реализации имх
Выводится что надо qDebug() << string; Выводится только один раз (вывожу в цикле) и только часть строки std::wcout << string; Почему так? Строка является std::wstring
>>1694445 >чисто стилистически следует ли писать отдельно поле private? Обычно внизу пишут, но я для своих проектов сверху леплю. Когда сам класс пишешь, удобнее сразу потроха видеть. Когда чужой класс используешь - внутренности не особо важны.
>>1696226 А потом волшебным образом на не на интеловских процессорах программа будет работать не совсем так, как задумывалось. https://3dnews.ru/997915
>>1696611 Ну, у меня файл используется только в этой функции, нет никаких лишних данных. Проверки на пустоту сделал, динамическую память нигде не использую.
Парни, помогите. Нужно сделать программу, которая делает зеркальное отражение бинарного дерева(данные из файла) и записывает его в другой файл. Вводные данные в виде(первая цифра-родитель; последующие- дети): 5 8 3 6 7 8 9 10 11 1 2 3 4 5 Порядок случайный. Можно использовать только fstream библиотеку.
>>1696685 Делаешь структуру узла бинарного дерева(инфо, указатель налево, указатель направо), делаешь функцию добавления и вывода. Добавляешь по принципу большее слева, меньшее справа(при условии, что в фале всегда большее справа) и все.
Сап анон, вопрос по выбору контейнера. Предположим, есть тип Player c id, name, bag, всей хуйней, как обычно такой формат хранят? Предполагается, что игроки часто удаляются, добавляются, а id - глобальный счётчик, считает подряд. unordored_map мне кажется нормально подходящим под задачу, но есть же ещё unordored_set? (Ключ для map берется тот же, что и player.id)
А если задача взятия i элемента по ключу не популярна, в основном все операции идут со всем контейнером, то может вообще использовать std::list, а при необходимости поиска просто пробегаться через find?
>>1697149 Игроков много всегда в один момент? Порядок игроков внутри контейнера важен? Структура не очень тяжёлая? Если на все вопросы ответ "нет", то думаю, что итерирование по обычному вектору быстрее будет. Удаление будет просто своп удаляемого элемента с последним. Хотя unordered_map тоже хороший вариант, да и чуть проще в исполнении.
>>1697347 Ну там не игроки, там другое, но да, много пиздец, по 10-100к, обновляется раз в секунду. Вектор не зашёл вообще из-за жирной реаллокации. Да и не нужны выровненные в памяти данные для таких объектов. >>1697287 unordored_map?
>>1697542 >Как же криво реализован shared_ptr Попробуй сам сделать, придешь к такому же решению. Если ты не понимаешь зачем так сделано (причем людьми которые гораздо опытнее тебя) - это не "криво", это просто ты недалек.
>>1697542 Лично мне очень редко нужен shared_from_this. Намного реже, чем сам shared_ptr, которым я и так почти не пользуюсь. Хотя емнип в асио это сильно используется.
Господа, поясните за паттерн Prototype. Почему прототип нужно копировать? Что мешает мне создать точно такой же объект с помощью new? Копирование быстрее, чем инициализация? Просто вот есть у меня куча объектов-прототипов, и у каждого по несколько полей-указателей. Я не понимаю, зачем мне заново прописывать инициализации для каждого из полей в методе Clone(), когда я могу просто создать новый объект, и все точно будет работать.
Хочу в катиться в thread, но мне для моей задачи надо знать, могут ли несколько потоков обращаться к одной области памяти одновременно. Если да, будут возникать баги или конфликты?
>>1698289 Почитай про понятие "состояние гонки" или на человеческом языке - race condition. Пусть кол-во тредов - N, если N > 1, то если хотя бы один из тредов пишет в общую между тредами область памяти - состояние гонки имеет место быть. Решается это несколькими способами - атомарными переменными, мьютексами (в твоем случае, скорее всего, подойдет больше мьютекс).
>>1698205 Как проще, так и делай. Clone() - это для тех случаев, когда через new будет либо сложно, либо не то. Например, объект был создан и настроен в коде, который ты не можешь или не хочешь менять, но при этом можешь делать его копии.
пзц, поубивал бы этих придумывальщиков "паттернов проектирования", более бесполезного учения в жизни не встречал
Кто-нибудь перекатывался из C++ на Java? 1. Сколько учили язык? В свободное время / во время работы? 2. С какой и на какую позицию перекатились? Сильно ли просели по зарплате? 3. Интересные ли задачи по сравнению с плюсами? Много ли своих заморочек? 4. Оно того стоит?
Работаю НЕ в НИИ, пишу на современном C++17 с пакетным менеджером, CI и всеми возможными плюшками, но чё-то пердолинга всё равно многовато. Что происходит с людьми пердолящими Qt и C++98 на заводе вообще не представляю.
>>1699259 >С какой и на какую позицию перекатились? Сильно ли просели по зарплате? Лол. В среднем зп джависта на процентов 20% выше чем у крестовика, поэтому при перекате в джаву по зарплате вряд ли кто-то проседал, скорее наоборот. >Интересные ли задачи по сравнению с плюсами? >Оно того стоит? На вкус и цвет, как говорится. Если ты находишь тырпрайз интересной отраслью разработки - джава для тебя. Кресты для игроделов и байтослесарей (разработкой браузеров занимается 1% из всех девов, поэтому я не беру их в расчет, например), то бишь отрасль совершенно другая, требующая совершенно других знаний. Прислушайся к своим интересам, чтоль.
>>1699294 >тырпрайз интересной отраслью разработки Кто-нибудь может пояснить кстати, что такое этот ваш тырпрайз/энтейрпрайз? Какие проекты считаются энтерпрайз? Писать вот те же браузеры это энтерпрайз или нет? Если нет, то чем написание энтерпрайз проекта отличается от написания браузера?
>>1698205 >Почему прототип нужно копировать? Что мешает мне создать точно такой же объект с помощью new? Чтобы избежать дублирование кода. Don’t repeat yourself
>>1699334 Тырпрайз это когда пишешь сортировку массива с printf. Потому что консоль это линукс, а линукс стоит на серверах, а серверы стоят в энтерпрайз корпорациях.
>>1699259 Расскажи поподробнее про твое текущее место работы позязя
Что за предметная область, в чем заключается пердолинг, средний уровень крестовиков, почему именно С++17 и какие конкретно фичи из него, смотрите ли на 20 стандарт, че нить поконкретнее про стек неплохо было бы услышать
Котаны, как реализовать события в С++? Допустим, у меня есть очередь и есть тред, который по сигналу должен добавлять элемент в очередь (сигнал приходит от другого треда).
Забыл добавить, что хочется исключить polling, а сделать так, чтобы тред сделал свое дело, заснул и по сигналу с другого треда вставил новый элемент в очередь.
>>1700360 Один из вариантов это от std::condition_variable плясать. Если взять как пример кода в https://en.cppreference.com/w/cpp/thread/condition_variable Код из функции worker_thread() добавить как метод класса очереди listen() и сделать там бесконечный цикл. Тред который хочет добавлять елементы в очередь вызывает queue.listen(callback) - и становится на паузу пока не будет изменена std::condition_variable. Тред который подает сигналы вызывает функцию notify() (в примере это main) которая меняет std::condition_variable, спящие пробуждаются, вызывается колбек и все уходит на новый цикл. Соотвественно нужно придумать способ прерывать этот цикл - очевидный это сделать так чтобы колбек возвращал булеан - нужно продолжать или нет. Но это как-то попахивает, незнаю почему. Колбек нужен чтобы скрыть эту все хуйню от клиенских тредов - они просто вызывают listen() и потом у них дергается колбек по сигналу - они не ебутся со всей этой кондишионал парашей. Естественно вмест околбека может быть какой-то делегат, функтор любой коллабле который тебе удобен.
>>1700747 Да дело не в этом. Мало того что мув конструктор не работает у packaged_task, так lifetime у callable ровно до того момента пока существует хоть один shared_future, даже если он уже давно готов. Со всеми захваченными в лямбду переменными, которые он, сука, должен был освободить.
Пикрилейтед. Что за хуйня, анон? Есть отсортированный вектор структур по определенному полю (здесь выбран int), вызывая бинарный поиск и через лямбду кастомизирую компаратор (без этого компиль не знает по какому критерию искать значение в векторе), он высирает аж 3 действия. Напоминаю, что временная сложность бинарного поиска - O(log(n)), сам логарифм по базе 2, в векторе 4 объекта. В таком случае, log(4) = ~0.6, то бишь, округляя, максимум за 1 итерацию поиска должно было найти значение, а тут аж 3 операции! Щито? Мб я чет наговнокодил и надо по-другому? Мб не через лямбду? Заранее спасибо.
>>1701022 >Напоминаю, что временная сложность бинарного поиска - O(log(n)), сам логарифм по базе 2, в векторе 4 объекта. Чёт пиздец. >В таком случае, log(4) = ~0.6, )))
Сап, анон. Есть два стула - возврат ответа через return функции, или возврат ответа в передаваемую ссылку:
A foo1(const B& b) { return b++; }
void foo2(const B& b, A& a) { a = b++; }
ирл встречал оба варианта. Особого удобства тоже нет, если параметров несолько, то можно запаковать в кортеж. Но я нуб в асинхронном и параллельном программировании, какой вариант лучше подходит?
>>1701227 В паралельном наверное лучше через возврат делать - это более чистый вариант (pure function) что плюс при многопоточности, хотя мне сложно привести какой-то конкретный пример, как минимум в плюсах. Передача через ссылку - если это сделано имменно для возврата значения (тоесть это не ссылка на какой-то расшареный на несколько функций ресурс) то единственная причина это делать - попытка экономить. Но с RVO это бессмысленно, и даже вредно учитывая что аргументы у функций не бесплатны. Тоесть в случае одного аргумента это 100% возврат значения. При двух и больше уже стоит смотреть что красивей выглядит. Скорее всего паковать результат будет удобней.
>>1701227 По ссылке обычно передаём то, что нужно именно изменить, т.е. например добавить в список или нарастить bounding rectangle. По значению всё остальное
>>1701022 >>1701033 >>1701149 Писал ночью и не соображал что пишут. По базе 2 получается log(4) = 2, но действий-то все равно 3. А должно быть максимум 2, нет?
Делаю splash screen в приложухе для андроида в qt. Делаю по этой инструкции http://zmc.space/posts/qt-android-splash-screen Сплеш скрин немного сдвигается вверх во время загрузки, то есть в момент когда тема у которой бэкграунд задан как сплэш сменяется на сплэш из манифеста. Сам глюк на пикриле. В статье предлагается просто убрать лого для сплэша и оставть только у бэкграунда темы. Но меня это не устраивает, так как между сплешем и появлением интерфейса приложения будет появляться пустой экран. Мне нужно чтобы сплэш скрин был как на обычных приложениях, без сдвигов и без пустых экранов. Как фиксить?
>>1701354 Нет, анон. Big O notation - это обозначение пространственной или, в этом случае, временной сложности алгоритма. Если возьмем частный случай, в нашем случае - бинарный поиск БЕЗ повторяющихся элементов, то его worst case, равно как и best case и average case, - это O(log(n)), сам логарифм по базе 2, ибо ты каждый раз делишь сортированный массив на 2. Worst case - это максимальное количество действий, в данном случае обращений к ячейкам массива, которое произведет алгоритм. log(4) по базе 2 = 2, но действий, как видно по выводу, 3. В чем подвох? Ошибка явно в коде, математика здесь ошибиться не может.
>>1701412 Причем здесь k? В массиве нет повторяющихся элементов так-то. И твое уравнение верно только если k очень мал по сравнению с n (в идеале, близок к 1), если k ближе к n, то это уже O(n★log(n))
>>1701493 Конечная сложность зависит от значения k. Если оно мало по сравнению с n, то это O(n), да. Если k примерно равен n, то сложность будет равна O(nlog(n)) по твоей формуле.
>>1701464 >>1701461 Пикрилейтед. Перед вами массив из 10000 чисел от 1 до 10000 включительно, соответственно, без повторяющихся значений. log(10000) по базе 2 = 13.287 То бишь, самое максимальное количество операций поиска по вышеприведенным данным = 14 (потому что 13 имеет остаток, засим это округляется к бОльшему значению при наличии остатка в таких случаях). Взяты пограничные значения, чтобы проверить максимальное кол-вл операций поиска. Все сходится, максимум = 14. Про какой k вы говорили яхз, повторяюсь, в массиве не было повторяющихся значения. ВРеменная сложность будет равнa O(k*log(n)) только если в отсортированном массиве будут k повторяющихся элементов.
>>1701487 >>1701553 >>1701542 Ебать тут парад шизов. У одного бинарный поиск массив сортирует, у другого константа k зависит от n, третий на серьёзных щах считает количество действий по О-нотации.
Как выше пытались пояснить, О(n) означает что при увеличении количества входных данных например в два раза, время выполнения/потребление памяти увеличится примерно в два раза. Так же и с O(log n). Если ты вместо 10000 элементов передашь 1000, то сравнений будет 10, а может 9, а может 11.
>>1701664 Потому что worst_case для бинарного поиска это что-то типа O(a + b log n) Как видно из твоего вычислительного эксперимента, b=1. Но это все равно нихуя не важно, т.к. O(a + b log n)=O(log n).
>>1701701 Worst case для отсортированного массива БЕЗ повторяющихся элементов - строго O(log(n)) с логарифмом по базе 2, откуда ты высрал a и b, шизоид?
>>1701760 > с логарифмом по базе 2 Логарифмы по любой базе отличаются дург от друга константой-множителем. Это в школе изучают Поэтому все пишу O(log(n)), а не уточняют что логарифм двоичный, натуральный или что-то в этом духе. Для этого логарифмы и придумали, можно с помощью таблицы логарифмов заменить трудоёмкое умножение сложением+поиском по таблице.
>>1701820 Дегенераты вроде тебя? Согласен. Ведь вы только высераете бред, не имея ни пруфов, нихуя. Откуда высрано a и b, шизик? Или ты мало того, что слился, так еще и обосрался?
Можно ли назначать виджетам события (это коллбэки в принципе) через наследование и полиморфизм? Есть гуй (мой личный), там есть класс Button. В конечном приложении назначаю событие клика так:
class MyAppButton1 : public Button { public: OnMouseClick(int x, int y) { / ... / } };
Какие подводные? Или нельзя сказать однозначно без всего контекста, нормально это или нет?
Аноны, есть один метод, который принимает basic_iostream. Мне нужно создать и передать какой-то стрим, в который я могу завернуть указатель на массив char* и очень важно чтобы без копирования. Может я не нашел, но что ли нету такого в std из всего их набора стримов и буфферов? Похоже все привязано к strings но там буфер копируется. У буста есть такой, неужели до сих пор в стандарт не попал? Вроде бы в задеприкаченом strstream такое было, но не помню. Но нафиг мне депрекаты.
Анон, мне просто это не даёт покоя. Ест у меня std::vector<double>, есть у меня std::transform, в котором pure функция (хз, возводит элемент вектора в степень и делит на 4), есть вектор для ответа.
Анон, я никогда не читал книги про работу компиляторов, но на мой взгляд, в релизе, ему очевидно, что можно распараллелить цикл, зная конечную архитектуру сборки. Почему тогда из коробки, само и неявно, не подключается какой-нибудь #pragma omp parallel for?
>>1702491 Ну это да, должен быть приватным. Я хотел понять другое, нормально ли чисто идеологически делать отдельный класс на каждую кнопку в приложении?
>>1702493 >Почему тогда из коробки, само и неявно, не подключается какой-нибудь #pragma omp parallel for? У распараллеливания достаточно большие накладные расходы, поэтому массив должен быть достаточно большим. Огульно параллелить всё подряд очень сомнительная идея, но она много кому приодила в голову, например, разработчикам компиляторов PGI
>>1702503 Ну если это какая-то навороченная кнопка, то хули нет? Посмотри, как в Qt это сделано: там если QAbstractButton и от него наследуются QPushButton и QToolButton. Если тебе нужно на твой кнопке картинку с аниме добавить - наследуй и добавляй
>>1702522 Собственно, делаю микроминималистический гуй под wasm, соотношу с тем, как сделано в QT и WX. Но пока что так понял, что наследование от классов фреймворка в целом плохая практика?
>>1702530 Создавать новый класс имеет смысл когда тебе нужен блюпринт, с помощью которого можно создавать много одинаковых объектов. Наверняка у тебя у разных кнопок разные обработчики, так зачем делать под это отдельный класс?
>>1702497 Msvc похоже что-то сам такое делает, и возможно intel cc тоже, так как мои перформанс тесты мило грузят весь проц, хотя я явно не писал ни политику выполнения для трансформ, ни omp. И включен только c++11, так как очень боюсь вероятной миграции на специфическую архитектуру. >>1702514 Спасибо
>>1702550 >она уже самим этим коллбэком отличается от инстанса своего суперкласса? Если у неё другое расположение, скажем, то она тоже отличается от инстанса суперкласса. Функции это первоклассные сущности, такие же, как числа
>>1702586 Если ты собираешься обрабатывать разнородные кнопки единообразнно (например, в цикле перебирать массив переменных базового класса или писать функцию, которая принимает аргумент базового класса) то нет, имеет смысл использовать наследование. Если не собираешься, то не имеет смысла.
>>1702600 У тебя есть два пути решения одной и той же проблемы – Пердолить на каждый вид кнопки отдельный класс – В базовом классе сделать "указатель на функцию" std::function и переназначать его для каждой кнопки Обычно идут вторым путём, с точки зрения полиморфизма оба случая равнозначны
>>1702286 Так а че, shared_ptr unique_ptr проблему не решило, им нужно теперь miracle_bugfree_ptr?? Наверняка тот код был написан на c++99 да и еще с самокрутками типа самопальных auto_ptr, или вообще на голимом си со strcpy и strdup и прочим говном. Теперь давай забаним плюсы, раз долбоебы даже c unique_ptr и move semantics не могут в безопасный код.
>>1702530 Ты логику прямо в кнопку вешаешь что ли? Лучше заведи класс MyCallbackButton, наследуй его от своей "базовой кнопки", внутри добавь std::function и два метода - setCallback(std::function) и execCallback(). Последняя приватная и проверяет, установлен ли callback. Как только у тебя произошло какое-то нужное тебе событие, пишешь execCallback() и всё
И как обычно хз куда лучше писать, сюда или в C Есть массив одной структуры, в структуре указатели на память. Часть памяти статически определяется, часть рантайм, маллоки и т.д. Хочу подчищать память универсально, одной функцией, после отработки.
Напрашивается вопрос - как сделать так, чтобы free не выдавал ошибку на статической памяти? Отдельно следить что я там разметил динамически - не хочется, так дебильно.
>>1702627 Статически это указатель на глобальную переменную или на стеке? Чет как-то криво звучит - в структуре хранить указатель на такую переменную. Почему не саму переменную тогда сделать частью структуры. >сюда или в с очевидно что в С с такими странными задачами. В С++ есть всякие смарт пойнтеры поэтому не нужно париться маллоками. Если хочется статики - делай ссылку вместо указателя.
struct s { s(b b) : _b(b) {} std::unique_ptr<a> _a; b& _b; };
std::shared_ptr<s> ss = std::make_shared<s>(b); в результате а dynamic, b - static и ничего освобождать не надо только непонятно зачем ебаться со статикой, жалко что ли в shared обернуть.
>>1702491 Двачую, бывало наследовал что-то от basic_ostream, каждый раз охуевал с неочевидности и залупности этой конструкции. Стараюсь с тех пор вообще с std стримами не связываться.
>>1702701 Хитровыебанность этих ебучих стримов выдает авторство страуструпа. У них два десятка параллельных спецификаций, для стримов и соответствующих им буферов, и в результате нет ровно того, что мне надо. И ведь уверен что автор либы, которому подавай это ебучий стрим, у себя внутри просто засасывает весь буфер и передает в какой-нить примитив типа write, т.е. ему можно было бы передать char* и не выебываться, особенно когда скорость важна. Но нет блять он выставил наружу модный стрим, и к нему нужно теперь десять прокладок наклеить, чтобы сраный буфер передать.
>>1702743 Ну да, ты же проебал информацию о размере, когда передал массив в функцию. Для неё arr — это просто указатель. На 64-битной платформе получится 2, на 32-битной — 1.
Чтобы не проебывать размер, его надо принимать в шаблоне: template <size_t size> void function(float (&arr)[size])
вызывать так же - function(arr) (ну и заодно вычислять ничего не надо)
>>1702620 Тру стори. В каждом более-менее крупном проекте в котором приходилось работать была хуева туча легаси кода со своими поинтерами, строками, аллокаторами и прочими велосипедами разной степени упоротости.
Если проект реально крупный, то строки поинтеры скорее всего использовались в разных подсистемах, следовательно должны быть более-менее универсальными. Зачем переписывать std::string например тогда?
Анчоусы, где можно найти список формул, таких, как производная высоты прыжка по времени, возвращающая координаты x и y или вектор движения? Может, есть какая-то библиотека, чтобы можно было задать начальное ускорение и угол прыжка и посчитать?
>>1702993 Если ты про стандарты то к тому времени как вышел первый ISO стандарт stl уже была. Но в последующих редакциях она дорабатывалась вектор из 2020 может отличатся от вектора из 1998. Хотя у меня пример нет, может по факту и отличий нет.
Продолжаю учить плюсы по вот этому сайту ravesli.com Дошёл до итогового теста в 5 главе https://ravesli.com/glava-5-itogovyj-test/ Намотался на второе задание. Я правильно понимаю, что смотреть ответ явно не стоит, а лучше перечитывать всю главу, потому что я нихуя из неё не усвоил? (Я типа написал код, который работает как надо за исключением самого важного - при выигрыше начинать новую игру. Вот тут у меня просто из головы вылетело как сделать так чтобы при else if(X = Y) ветвление завершалось нахуй и завершался цикл в котором функция с этим ветвлением вызывается. Пробовал goto, но нельзя какого-то хуя вызывать лейбл из другой функции как оказалось. Возможно я вообще не так всё сделал и с моим текущим подходом нихуя не выйдет и надо делать совершенно по другому и с нуля)
>>1703750 Да я уже всё сделал. Правда максимально всратно и мне ебло разобьют если я такой код покажу приличным людям. Но поставленную задачу выполняет.
>>1703750 А вообще, все эти помойные сайтики тебя ничему не научат. Советую взять в руки хорошую книгу и учить язык по ней. А начать вообще с книги k&r по си. Там очень хорошие задачи и много интересных примеров, которые заставят поломать голову. Сама книга маленькая, всего около 300 страниц, читается за пару недель.
>>1703771 Мне на плюсах надо, я за шарп не шарю. Получилось вот такое https://ideone.com/hWH6uu . Как видно у меня всё в main лежит, а новая игра вообще через goto блять. У авторов решение конечно гораздо элегантнее
>>1703771 В голос с этой сисярп макаки. В простейшем коде умудрился нахуячить ошибок и наговнокодить: 1. Попыток 8, а не 7, при этом даже если 8 раз ты ответишь правильно, тебе скажут что ты проиграл. 2. Если ответишь правильно, то тебе напишут "Too big", а потом скажут, что ты выиграл. 3. Блок if не нужен. 4. Лишнее присваивание переменной guess
>>1703810 Потому что, как сказал этот >>1703757 господин, учиться нужно не по говносайтам. При этом любые обучающие сайты говно, при условии, что это не обучение какой-нибудь динамикопараше вида жопаскрипта, которая учится за вечер и пару бутылок водки. Читаешь эту 300 страничную книгу, а потом берёшь книгу Страуструпа и начинаешь изучать C++.
>>1702896 Я не он, но опыт такой тоже был и вопрос "нахуя" нужно задавать пионерам, которых уже с нами нет давно, как водится. Если проект реально крупный, то начали его в хуй знает какие времена, когда еще народ табак курил и йогой не занимался, не говоря уже про соблюдение каких-либо best practices в программировании. Интересно было бы узнать много ли народа писало на С++11 в 2012 или С++17 в 2018. Только только начали умирать от коронавируса престарелые писатели самопальных аллокаторов, взрощенные на голых сях и С++99, но дело их еще живет в больших и старых проектах. Но не побеждает.
>>1702941 Да ничего, программирование скоро станет просто хобби, как музыка и искусство. UBI уже почти на подходе, будем получать небольшое пособие, и спорить в форумах, какой язык самый крутой. А реальный софт будет писать AI. Быстрый и без багов.
>>1703889 Застукать бы одного такого стрингера с поличным , и просто спросить вежливо - нахуя. Просто интересно знать. При чем неважно даже если это мегалегаси код. За такое и 10-20 лет назад нужно было убивать.
>>1702941 Учиться надо программировать, используя для этого средство по душе. А то наслушаются всяких пидоров и прокрастинируют потом. Толку-то с труъшной технологии, если накодил пару часов за месяц? А вот выберешь, что прет, и количеством написанного кода компенсируешь всю нетруъшность своего взросления. Алсо, актуальное на рычноке и подходящее для учебы - взаимоотталкивающиеся вещи. Так что не стоит лучшие годы губить на всякое говно, на первой работе все равно обязательно насосешься, при чем капитально. Кстати, для концептуально прокачанного путь к нормальному трудоустройству короче, просто это беспалевно делается. Какой-нибудь задрот фреймворков даже не заподозрит, что ему отказали за общую тупость, и продолжит дрочить свою охуительную область знаний. Он на своем уровне и не может воспринять эту сторону действительности. А умного паренька, который даже язык в глаза не видел, невзначай возьмут, ведь адекваты негласно понимают, что нет ничего практичнее хорошей матчасти. Рыночек формально не способен этого понять, но жизнь все фиксит. Фактор необучаемости и гавнокода, несущего нулевую пользу для проекта, перечеркивает всю подкованность по стеку.
>>1703828 И после этих двух книг брать ещё одну, чтобы наверстать то, что добавили в язык за последние 20 лет? Да это пиздец, лучше сразу что-нибудь современное читать, например вот это https://codernet.ru/books/c_plus/beginning_c_17_from_novice_to_professional/ и не тратить время на всякие strcpy и т.п. Если в книге не упоминается string_view, например, то сразу нахой.
>>1703892 Чтобы стандартизировать кодировку, например. У встроенных строк как-то уж очень долго налаживается дружба с юникодом. С появления char16_t ещё 10 лет не исполнилось, а char8_t вот только подъезжает. Ну и всякого рода оптимизации. Тысячи их.
Чето осознал ультрапроеб в жизни, через буквально дней 20 диплом, а после свободное плавание, решил выбрать как основной профиль с++ и дрочил его годик основательно так, хотя и до этого знал его. Стал с недавних пор смотреть рынок вакансий по дс2 и..бля ну и хуета, хуй без опыта куда возьмут, а где берут, то стек технологий какой-то ебанутый или сама компания какой-то ебанутой хуйней занимается, чета ваще пиздец, пчелы
>>1704010 А ты как хотел? Или ты один из тех долбоебов, которые думают, что изучив динамикопарашу они стали программистами и знать, что там внизу им совсем не надо? После чего такие удивляются, почему это у них цикл в котором они строки складывают, жрёт пару гигабайт памяти. Весь сахарок в 17 стандарте строится на том что было до него, поэтому для того чтобы писать хороший код ты должен изучить эти основы, только после этого уже смотреть на сахарок и радоваться, потому что понимаешь как надо было бы писать код, если бы тебе этого сахара не насыпали.
>>1704026 год-два позанимайся какой-то ебанутой хуйней с ебанутым стэком, и дальше ищи нормальную работу. Я в свое время вообще писал на каком-то ебанутом языке, формально числившись С++ разработчиком. Ради того самого ОПЫТА в резюме.
>>1704396 И начальник\директор тогда сказал "Вот, молодые то идут к нам, все на javascript\python хотят программировать, чтобы потом в гугле работать, а я всю жизнь был прикладным программистом" - примерно слово в слово
Аноны, два дня потратил на то, чтобы написать игру. Теперь понимаю, какой я дебил. Выключили электричество а вместе с ним и мой комп. После этого захожу в проект, а он может прочесть 1 файл из 3. На хедер мне похуй, вся проблема в cpp файле, который открывается через блокнот, в котором ничего не отображается. Шиндовс говорит, что какие-то байты в нем все еще есть. Как его восстановить, не хочу, чтобы 2 дня трудов пропали за зря? Может, у него шапка слетела и попытаться переписать байты с новой шапкой? (Хуй знает вообще, как он устроен)
>>1702905 >производная высоты прыжка по времени Это просто скорость называется. Может тебе ускорение нужно, тогда это 2-я. 3-я называет джерк. 4-я джолт. По-русски можно придумать типа рывок, потом толчок, потом чпок.
>>1704941 >>1704766 Я понял. Просто не мог сразу на русский адекватно перевести. Имеется ввиду "угадывание" (догадки компидятора какой тип перемнной передался) типов
>>1704234 Основы — это основы, их в любой книге для начинающего дадут так или иначе. Я говорю про всякую устаревшую фигню, из разряда, например, что нет смысла сначала учиться не возвращать "большие" объекты из функции по значению, а потом учиться, что теперь так можно. Или читать про какие-нибудь wstring_convert и codecvt, а потом узнавать, что они пукнули и обмякли. Или вникать в фантазии Страуструпа про то, какие безграничные возможности открывает наследование фасетов локалей, чтобы потом выяснить, что они обосрались с кодировками переменной длины. Ну или те же функции из сишки, которые можно просто посмотреть по докам если приспичит, а специально учить их нет никакого смысла (тем более, какой-нибудь современный вижак тебя заебет варнингами при попытке ими воспользоваться). Ещё такой момент, книга Страуструпа в основном описывает только стандарт. Про тот же wchar там ты прочитаешь только, что это тип достаточного размера чтобы вмещать неизвестно что. А в книге, на которую я дал линк, например, сразу написано, как оно реально живет на разных платформах, и что с этим делать.
>>1705031 Спасибо, но тогда компилируется для вызовов типа f(vector<unsigned>, int), А я хочу чтобы тип был строк одинаковый. Например, этот вариант рабоатет только для std::array, но он требует, чтобы два типа были строго одинаковые:
template<typename T, std::size_t size> auto f(const std::array<T, size>& arr, T o) { auto it = std::find(arr.begin(), arr.end(), o); if ( it != arr.end() ) { std::cout << "found\n"; } else { std::cout << "not found\n"; } }
template <typename T, typename U> void f(const T& arr, U value) { static_assert(std::is_same<T::value_type, U>::value, "array and value must be of the same type"); ...
>>1705485 Ну собственно по той же причине, почему вот это не компилируется:
template <typename T> T sum(T arg1, T arg2) { return arg1 + arg2; }
sum(1, 5u);
компилятор не может автоматически определить, какой из двух типов брать за T. А с value_type у него, видимо, никакой дилеммы нет, и он сразу понимает, что T — это то, что в контейнере.
>>1705615 > Изначально value_type добавили, чтобы сделать функцию, которая может принимать как vector, так и array. Пиздос. Скоро динамическую типизацию завезут
>>1705838 >шаблоны >динамическое Ну формально компайл-тайм таки статический. Другой вопрос что во время компиляции шаблоны выполняются как бы динамически. даже хотят jit в интерпретатор типов захуярить а то ЧЕ-ТО ТОРМОЗИТ А динамикопараша регулярно переизобретается еще со времен С. Начиная с void* до СОМ и QObject.
Поясните по этому видосу https://www.youtube.com/watch?v=mrq2nmKz5qI Вопрос из комментов: Не понял синтаксиса функций begin и end. Они должны возвращать объект типа Iterator. Однако, они возвращают объект типа T*.
Допустим я пишу игру. У меня есть класс Placeable, хранящий координаты объекта, Damageable, хранящий прочность и защиту и обрабатывающий получение урона, Temperature, хранящий данные о температуре объекта, и так далее. Куча разных свойств. В результате, другие классы, например, Npc будет наследоваться если ни от них всех, то от большого количества. Это нормальная практика так абузить множественное наследование?
>>1706406 >Тут функция класса которая возвращает строку. Не строку, а указатель на неё. T — это char✱ arr - это T✱ следовательно, return arr возвращает char✱✱
>Как переменной класса можно присвоить строку? Ты про какую переменную?
>>1706406 Блядь, забудь слово "присвоить", понял? Итератор инстанцируется этим return'ом. Не присваивается, а создается. Потому что есть конструктор из указателя (строка 46, как сказали выше), который передан в return.
>>1706386 Геймдев просто исторически был довольно консервативный в плане всяких фич. Потому что иначе проблематично, когда не знаешь, на какую ещё мыльницу придется в будущем портировать игру, и какого уровня свежести и разъебанности на ней будет компилятор.
В Qt примерах некоторые объекты создают чисто в конструкторе класса виджета: QVBoxLayout ''vbox = new QVBoxLayout(this); А некоторые объявляют сначала в хедере: private: QPushButton ''okBtn; И потом выделяют под них память в конструкторе okBtn = new QPushButton("OK", this); Как лучше делать?
>>1706825 Тут просто явно показывается, что лейаут ты сделал и забыл, а состояние кнопарика возможно будет дёргаться из других методов (хотя по идее все коннекты можно и в конструкторе сделать). Лучше забей и научись формошлепить в дизайнере.
Анончики, как считаете: нужно ли делать переменные (чаще всего константы), значения которых точно больше нуля, беззнаковыми? Например, размер экрана. Сейчас проебался на этом на этом мальца. При создании установил положение сущности по x в -R_WIDTH использовал эту беззнаковую константу, чтобы не писать -1000 например, т.е. (как думал) за пределами экрана, а нихуя. Оно в UINT_MAX установилось.
Как так получилось, что в стандартной библиотеке используются названия строчными буквами, через подчеркивание, а в гугловском стайл гайде и паре проектов, в которые я посмотрел, используется кемелкейс. Это специально так сделано, чтобы отличать объекты из стандартной библиотеки от всего остального или что? Мешанина стилей же получается.
>>1706378 Кстати мне всегда интересно было ECS переводится как система компонентов сущности? Или это типо 3 разных элемента как MVC например модель-представление-контроллер.
>>1706364 > У меня есть класс Placeable Замени на vec2f pos; если это двумерная игра
> Damageable, хранящий прочность и защиту Сделай класс\структуру Stats
> Temperature, хранящий данные о температуре объекта урона Перенеси в Stats
> Npc будет наследоваться если ни от них всех Сделай Object: совсем базовые возможности для объекта Унаследуй и сделай GameObject, объекты с которыми можно взаимодействовать: двери, рычаги Дальше NPC: тут уже много чего, атака других npc, получение урона, применение способностей
Можешь посмотреть на структуру классов в mangos (эмулятор сервера для вов, если играл в него то будет несколько проще разобраться) Правда, думаю, будет слишком сложно сразу так разобраться в нём.
>>1707203 > Ну так, а какой не говно? Твой личный или тот, который принят в твоей фирме\команде. Можешь длянуть стайлгайд в nasa Это вообще пиздос (в хорошем смысле), но он ориентирован на Си кажется
>>1707336 Размещай так, чтобы в хедере было ровно то, что используется - не больше и не меньше. Но при этом старайся по максимуму использовать предварительное объявление.
>>1707401 Ну вот у меня виджеты qt разные, они наследуются от каких-то готовых классов, плюс везде используются всякие типовые классы типа виджетов размещения. А что за предварительное объявление?
>>1707421 Обычно в таком случае подключается заголовок с базовым классом, а остальные штуковины предварительно объявляются (у тебя ведь только указатели, да?)
Если я перегружу оператор = для статичных переменных, где возвращается this, то он будет работать для переменных выделенных с помощью new? Вот например так
p1 - типа myClass - там уже что-то лежит myClass* p2 = new myClass p2 = p1
>>1707446 >>1707431 Я слышал, что в каком-то компиляторе была такая шутка: в нём был счётчик употребления в коде ключевого слова "inline". Если счётчик превышал какое-то значение, то компилятор дальше игнорировал все инлайны. А запись вида func( void ); пришла из Си. Там таким образом обозначалось что функция не принимает аргументов, а пустые скобки означали любое количество аргументов.
>>1707443 Да я не про это. Есть такая штуковина, называется CamelHumps (он же subword navigation). Очень полезная и удобная штука, т.к. зачастую нужно изменить что-то в середине слова и без этого приходится стрелками искать позицию, или ещё хуже - мышкой. Так вот мне интересно, как оно работает со снейк-кейсом.
>>1707452 Может быть зависит от алгоритма который встроен в редактор\иде? Сейчас проверил в qt creator Для my_title (курсор находится перед m), после ctrl+r переместился к t Для myTitle аналогично
>>1707449 >Я слышал, что в каком-то компиляторе была такая шутка Ты слышал шутку. Не сравнивай сегодняшние компиляторы и их возможности с компиляторами 20-ти летней давности.
>А запись вида func( void ); пришла из Си Ахуеть, спасибо зумер, я-то и не в курсе был. Ещё раз — а ты уверен, что на всех таргетах (кроме пк были ещё nintendo gamecube, xbox, ps2) были достаточно поддерживающие плюсы компиляторы? Если что, в 2001 уже был первый релиз и очевидно что разрабатывать начали даже до 2000-х. Я вот лично сомневаюсь, что в среднем компиляторе по больнице в то время была реализована хотя бы половина 98-го стандарта.
>>1707427 Ты имеешь в виду в хедере класса надо указывать все эти QLineedit и кнопки, там же инклюдить классы для этих объектов, а в cpp файле только подключать этот хедер? У меня в конструкторе без объявления они создаются через new, доступа к ним не будет что ли?
А вот мне интересно. Пишет человек игру, использует новые фишки языка. Игра работает на линукс и виндовс. Потом он хочет перенести ее на ps. Сильно ли ему придется менять код? И где он вообще будет брать стандарты языка для данной платформы?
>>1707552 В 2к20+ уже все хорошо с этим, у Sony юзает LLVM (и вообще x86 процессор а не кастомную залупу) а м$ не лезет в анус и тоже быстро подхватывает последние стандарты, так что такой проблемы нет (ну, разве что последний стандарт может на пару-тройку лет запоздать до выхода нового поколения с новым девкитом, лол). Но такого, как лет 10-15 назад, чтобы у всех были свои процессоры и компиляторы для ц (не всегда даже с классами как в случае с псп) — уже нет и в помине, даже на рынке китайского андроид-скама уже один арм одной версии остался.
>>1702788 >>1702790 Спасибо, я так и сделал, но похоже не судьба. Та либа, которой этот стрим нужен похоже елозеет по стриму туда-сюда, что вроде бы не должно быть проблемой. Но там какие-то косяки. А когда я подсунул ей класс из буста, то все работает - он тоже наследует basic_streambuf и оверрайдит все методы, и оказалось что либа-сука дергает кучу этих других методов зачем-то, которые тоже нужно самому имплементить типа underflow и seek. Короче это майндфак и того не стоит. Придется буст юзать.
>>1707575 Да я пока не очень представляю как они будут взаимодействовать, например кнопка "удалить" должна удалять выделенную строку из таблицы-представления, то есть в слот-обработчик нажатия надо как-то передать это значение столбца выделенной строки, чтобы я мог сформировать запрос на удаление. Не пилил подобное на qt?
>>1706791 буст так-то это основа всех фичей в новых версиях С++ начиная с 11-й. Но понимаю, с бустом скучно, нет возможности пилить свои собственые примочки, которые гораздо лучше, чем стандартные. Можно свой класс тред написать.
>>1707587 Ну и что непонятного? Подключил кнопку к обработчику, внутри спросил у таблицы выделение, узнал строку, попросил модель удалить эту строку. Это же basic хуйня, без неё ты в qt глубоко не продвинешься
>>1707149 Не нужно. Используй беззнаковые только там, где оно необходимо (в байтоебстве каком-нибудь). Даже сам Страуструп и другие авторы признавали, что применение беззнаковых в стандартной библиотеке (типа size_t) было проёбом, и из-за них случается много ошибок. Кому интересно, смотрите тут https://www.youtube.com/watch?v=Puio5dly9N8 на 9:50, 41:08, и 1:02:50
>>1707149 Беззнаковые нужны только тогда, когда тебе нужно хранить большие положительные числа, самый типичный пример - хранене Id. И оно не поможет в случае если значение ниже нуля недопустимо. Вычтешь ты из беззнакового нуля единицу, получишь arithmetic overflow или макс значение для этого беззнакового числа.
>>1707767 >Вычтешь ты из беззнакового нуля единицу, получишь arithmetic overflow или макс значение для этого беззнакового числа. Можно, наоборот, добавлять единицу: ( size_t i = 0; i + 1 < width; ++i ), если нужно i < width - 1.
Зачем используют -fvisibility=hidden? Нашел только ответ чтобы в таблицу символов не попадали ненужные символы. Это как-то заметно улучшает производительность? Вроде как api определяют заголовочные файлы, которые либа будет предоставлять, так что в плане скрытия внутренних деталей наверное это не особо имеет значение чтобы в таблицу попадали тольок те символы, которые нужны.
>>1707914 Вообще это в духе современного c++. На винде оно и так всё скрыто по умолчанию, с модулями тоже будет пролазить только то, что явно экспортируешь и зависимости.
Мне тут советовали читать майерса для плюсов. Но мне показалось что это уже для чуть шарящих людей. Я из stl знаю только вектора и некоторые функции из algorithm. Точно майерс то, что мне нужно?
>>1708199 > читай у Мейерса "Эффективное использование С++" и "Наиболее эффективное использование С++". Потом "Эффективное использование STL" Это же все устарело
>>1708203 >Это же все устарело Че несешь? Больше 3/4 советов еще актуальны. А с учетом возможности столкнуться со старой кодовой базой то и остальные пригодятся
>>1703931 >наслушаются всяких пидоров и прокрастинируют Ну так ты сам на это и подталкиваешь, дядь, возводя в абсолют труЪ программиста, который не знает ни одного языка, но зато знает Vатан, задроту фреймворка. Итого у условного вкатывальщика-студента складывается впечатление, что языки изучать - сродни пинанию хуёв, а вот матан знать это ТруЪ. Затем он задаётся вопросом: "А какой же самый правильный способ изучения матана?" - на что его мозг сразу генерит ответ - "Конечно же, по советским учебника, они же ТруЪ!". Затем этот лихой молодец скачивает задачник Демидовича и пару томов какого-нибудь Зорича и начинает хуярить. Вот долго такой протянет на ручной тяге?
P. S.На следующий день же всё бросит и продолжит свою прокастинацию
>>1707636 Да я пока на поверхности плаваю, да, поэтому простые/глупые вопросы такие. Алсо сделал диалоговое окно ввода данных в таблицу, так вот в слоте не видно модель данных, она у меня чисто в конструкторе создается без объявления. Если вынести ее в объявление как поле класса в секцию public чтобы слот мог работать с моделью, это норм практика? Или надо как-то через геттер доставать, но я не представляю как потом этот объект передавать в слот.
>>1708288 Нихуя не понял, что ты хочешь сделать. Если у тебя есть окошко с таблицей, то храни там указатель на свою модель и устанавливай её в таблицу. Если хочешь через диалог вводить данные, то в своём обработчике нажатия на кнопку открытия диалога просто его запускай, а по завершению спрашивай в него данные, которые пользователь ввёл и заноси их в модель - если правильно напишешь методы, то таблица автоматом обновится
>>1708311 В конструкторе виджета с таблицей у меня вот так создается модель: QTableView "view = new QTableView(this); QSqlRelationalTableModel "model = new QSqlRelationalTableModel(this); То есть в хедере я не указывать, что у меня в классе объекты этих классов есть, поэтому слот не может к ним обращаться. >ошибка: 'model' was not declared in this scope model->insertRows(0, 1); Ну вот если я укажу модель в хедере, то слот должен получить доступ к ней, верно?
>>1708316 Все, я понял, там и private будет доступно в слоте, это же метод класса. Просто в конструкторе область видимости ограничена фигурными скобками как и в любой другой функции. Добавилась запись.
На buffеrstrеam мне пох, это просто удобная обертка. Мне нужно спиздить минимум из basic_buffеrbuf. Он наследует от std::basic_strеambuf, то есть базовая идея та же самая - передать туда указатель на char* и его длину и в конструкторе он вызывает sеtg, который устанавливает указатели на начало - еback() (что за мудацкое название для начала буфера!), текущий - gptr() и хвост - еgptr().
А потом создать istream и в конструкторе ему подсунуть этот хитрый буфер унаследованный от std::basic_strеambuf .
Бустовый basic_buffеrbuf оверрайдит несколько виртуальных методов из basic_strеambuf которые по дефолту возвращают ошибку, и если они дергаются, то нужно их оверрайдить в своем классе. Если из std::istrеam'a просто тупо прочесть один раз, то ничего переопределять не надо и sеtg достаточно. Если же либа по нему елозеет, нужно оверрайдить sееkoff, что в общем тривиально кажется, если нет подводных.
>>1708211 Найс матчасть на матан подменил. Матчасть - это нарицательное для всего концептуального. Я говорю не про матан, и даже не про анализ алгоритмов, а про умение мыслить, как погромист. Можно сказать, про архитектуру, но опять же не дрочить умные практики, а а органично расти в этом плане путем написания своих велосипедов. И велосипеды надо писать на языке, который охунен сам по себе, а не который на рыночке на слуху. Так больше напишешь, меньше напрокрастинируешь, вот о чем речь.
зачем вычислять n, как разницу между хвостом и головой и потом в setg снова прибавлять его к голове, ведь получим тот же резултат this->egptr() - this->eback() + this->eback(), пиздец. Тем более голова и хвост фиксируются один раз и больше не меняются в принципе.
По-моему можно прсто this->setg(this->eback(), this->eback() + off, this->egptr());
>>1708411 Ну у меня две таблицы, связь через внешний ключ, там вместо Id отображается нормальное название. И я кстати из-за этого не знаю, можно ли добавлять в этот столбец строку или только id(int), ведь этот столбец интовый в самой бд.
Кстати вот так можно удалить запись? model->removeRow(view->rowAt() ); model->submitAll();
>>1708466 Да. Они так вызывают методы, которые в базовом классе определены. ХЗ зачем, может чисто для визуального эффекта. Кажется разные стайл копы в С++ и C# по-разному к this относятся, одни орут чтобы убрать, другие наоборот его хотят. Хуйня это все.
Двач, мне ошибку при дебаге в Qt Creator выбрасывает, как мне узнать что это делает? Подскажите плиз. This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 2)
Потом в QML и в QWidgets вот так вот написаное это самое событие имеет вид onSomeChanges почему для чего - хуй знает, что бы путались больше и искали почему не работает.
>>1708518 Как понять стандартные? любой метод в сигналы добавляешь, эмитишь из любого места внутри методов класса, в кьюмеэле и в виджетах у тебя событие вылитает через метод с приставкой on+заглавная первая буква
>>1708526 Я не заметил on, зато заметил последнюю букву разную, подумал что в разных местах метод по-разному назван. Кстати для чего QML и QtQuick используются?
>>1708538 >Кстати для чего QML и QtQuick используются? Это как XAML, только не через жопу. Декларативно реактивный язык описания интерфейсов. Грубо говоря у тебя приложение разбивается на бек на плюсах и фронт на QML и жопаскрипте
>>1708468 Ты можешь вообще что угодно показывать. В бд будет интовый ключ, а твой метод data() для столбца с этим ключом будет возвращать анимешные картинки
>>1708642 Не подскажешь метод, который возвращает текущую выделенную строку в моей таблице, чтобы я кнопкой удалил? Что-то могу найти в документации, там какой-то еще новый класс, связанный с индексами, просто не получится получить номер что ли. model->removeRow(view->???()); model->submitAll();
>>1708676 QModelIndexList selection = view->selectionModel()->selectedRows(0); if (!selection.empty()) { QModelIndex idIndex = selection.at(0); int del_id = idIndex.data().toInt(); model->removeRow(del_id); model->submitAll(); Так примерно принято делать?
>>1708703 Спасибо за совет, действительно посмотрел в sqlbrowser'е их как они удаляют, вроде работает и у меня вот так: QModelIndexList selection = view->selectionModel()->selectedIndexes(); if (!selection.empty()) { model->removeRow(selection.at(0).row()); model->submitAll(); model->select(); } Еще setselectionbehavior задал для вью, не знаю, влияет ли это. Программирование вслепую. >>1708720 Сигналы, насколько я понял, нужны для взаимодействия разных виджетов, а у меня и вью и таблица и кнопка все находятся в одном классе наследованном от qwidget.
>>1708726 > Еще setselectionbehavior задал для вью, не знаю, влияет ли это. Из названия очевидно, что это влияет на вид выделения - ячейка/строка целиком/етц > Программирование вслепую. Не программируй так, открой лучше кутишную документацию и по любому поводу туда заглядывай.
>>1708726 > Сигналы, насколько я понял, нужны для взаимодействия разных виджетов Не совсем. Если пишешь свою модель, то нужно изнутри посылать сигналы о разных своих действиях. Тот же removeRow. В твоей модели уже это всё написано за тебя, но по идее ты должен наследоваться от абстрактной модели и переопределить этот метод. Внутри посылаешь сигнал, что собираешься что-то удалить, потом удаляешь из своего списка ячеек/базы/файла/етц, потом посылаешь сигнал о том, что закончил удалять.
>>1708772 Уверен процентов на 90, что при вызове view->setModel(...) эта самая view подключается ко всем этим сигналам - rowsAboutToBeRemoved(), layoutChanged() и прочие
>>1708538 Что бы нажатие кнопок, перемещение элементов, списки и вот это вот все в плюсах не писать как это обычно у всех делается. Одна из главных фичь это кастомизация как в вебе - кнопку можно там картинкой нарисовать или тупо текстом, стиль менять динамически, хуверы-хуюверы драгндропы вот это вот все. Относительно хтмл+жс+цсс гораздо проще устроена свистопляска со слоями элементов и отступами от краев синтаксис более приятный чем хмл бяка, но в остальном к сожалению во всем уступает.