Задать вопрос
  • Как исправить ошибку "идентификатор "to_string" не определен" в Visual Studio?

    @MarkusD Куратор тега C++
    omerkhan , сперва тебе нужно исправить нарушение П3.4 и П3.8 регламента работы сервиса.
    Код запрещено публиковать в изображениях. Лирические отступления в вопросе лишние.
  • Как расширить массив с++ (добавить элемент)?

    @MarkusD Куратор тега C++
    дмитрий шевченко, не стоит удивляться, стоит изучать документацию. Например, библиотеку контейнеров.
    Ну и книги подходящие. Например: Леена Аммерааля или Яцека Галовица.
  • Где взять заголовок graphics.h?

    @MarkusD Куратор тега C++
    Mercury13, все верно. Любой кто видел здесь c++ код без оформления, так или иначе, догадывается что нужно обратиться к исходнику вопроса чтобы увидеть код целиком.
  • Какие компоненты для установки выбрать в Visual Studio 2022 Чтобы изучить сам язык C++?

    @MarkusD Куратор тега C++
    Владимир Коротенко, вот и не начинай холивар, не зная текущей обстановки дел. :)
    Тебе лучше сперва освежить знания касательно студии. Твои "доводы" лет на 10 устарели, примерно как Android Studio на базе Eclipse.
    Выбор инструмента всегда идет от задачи. Человек сделал свой выбор от своей задачи, твое предложение другого выбора выглядит уже как холивар.
  • Где взять заголовок graphics.h?

    @MarkusD Куратор тега C++
    Василий Банников, у Mercury13 есть скилл рентгеновского зрения :)
  • Какие компоненты для установки выбрать в Visual Studio 2022 Чтобы изучить сам язык C++?

    @MarkusD Куратор тега C++
    Владимир Коротенко,
    почему допустим не Eclipse

    Все просто. Eclipse тормозная и полностью дисфункциональная по сравнению со студией.
    Без плагинов Eclipse уже не блещет скоростью сопровождения разработки, а с плагинами и вовсе не радует.
    Не радует у Eclipse уже даже скорость загрузки от старта и до первого экрана. Студия запускается за 3-5 секунд, Eclipse - около 40 секунд. За это время можно уже и забыть зачем ее открывал.
    Зачем пользователю C++ советовать написанный на Java инструмент, когда он может взять себе инструмент написанный на C++?

    Например Android Studio

    Это не так. Android Studio разработана на базе IntelliJ IDEA от JetBrains. Уже очень давно.
  • Исходный файл не находит соответствующую функцию, как исправить?

    @MarkusD Куратор тега C++
    zenz,
    в общем написать свою функцию remove_copy

    Смысл фразы "Remove Copies" буквально означает удаление копий. Возникают вопросы: откуда будут удалены копии, копии чего нужно удалить, как именно удалять копии и так далее. Из параметров алгоритма с таким именем сразу будет ясно что копии удаляются из переданного диапазона и удаляться будут те копии, которые соответствуют переданному аргументу. В стандарте такой алгоритм называется std::remove_if[?].

    Цель функции была скопировать ненулевые элементы одного контейнера в другой

    Такая функция не может называться "Remove Copies", это противоречит смыслу этой фразы.
    Такая функция может называться или "Filter by Condition", или "Copy If Condition". Собственно, в стандарте такой алгоритм называется std::copy_if[?].

    Понимаешь разницу смыслов? Ты хочешь копировать элементы по условию, а не удалять копии элемента.
    Грамотное отражение смыслов конструкций в их названиях лежит в самой основе всей инженерии ПО. Этому лучше начинать учиться как можно раньше.
  • Исходный файл не находит соответствующую функцию, как исправить?

    @MarkusD Куратор тега C++
    zenz, небольшой совет тебе на будущее.
    П3.8 регламента запрещает публикацию текста в изображениях. Многие люди, как и я, просто отказываются вчитываться в том мыло, которое ты опубликовал. Лично мне мои глаза дороже ответа тебе.
    Поведение в нарушение правил бросает обществу вызов, поэтому такое поведение и называется вызывающим. Я просто советую тебе не заниматься этим.

    Окно вывода ошибок не всегда является информативным. В твоем случае куда более информативным будет являться лог сборки проекта. И там, в твоей ситуации, действительно больше написано чем ты показываешь. Я от тебя ожидал ошибки именно из лога сборки.

    По коду твоего шаблона. Если его суть действительно в удалении копий переданного значения, то тебе не нужен третий параметр в сигнатуре функции. Вместо этого тебе нужно возвращать итератор нового окончания диапазона.
    В функцию ты передаешь диапазон в виде двух итераторов. В теле функции ты заводишь еще один локальный итератор от начала диапазона. В цикле по элементам диапазона: если нашелся дубликат - просто переходим к следующему элементу; если локальный итератор и итератор текущего элемента одинаковы - двигаем локальный итератор дальше; иначе перемещаем значение текущего элемента в позицию локального итератора и двигаем локальный итератор дальше. В конце функции возвращаем значение локального итератора как значение нового конца диапазона.
    В момент обнаружения дубликата позиция локального итератора и текущего элемента диапазона разбегутся, а в конце цикла дистанция разбежки между локальным итератором и концом диапазона будет означать количество обнаруженных дубликатов.
  • Почему мой вектор не работает со строками?

    @MarkusD Куратор тега C++
    Sergo Zar, и тебе спасибо что отнесся к моим словам с пониманием.

    delete[] arr, temp;
    Тут используется operator , (), поведение которого по умолчанию возвращает только правый операнд.
    В твоем коде утекает arr. Разбей эту строку на две, в каждой из которых удаляй конкретный массив.

    void pushBack(T value)
    Логика работы этого метода должна быть такой:
    1- увеличить длину вектора на один;
    2- увеличить емкость вектора если длина стала больше емкости;
    3- переместить в последнюю ячейку вектора состояние объекта value.

    При этом, процесс увеличения емкости должен быть такой:
    1- изменить емкость согласно закону роста емкости;
    2- создать блок памяти размером новой емкости и локально сохранить его указатель;
    3- переместить все значения ячеек старого блока памяти в новый;
    4- удалить старый блок памяти;
    5- записать новый блок памяти из локального указателя в состояние вектора.

    У тебя поведение этой функции не вписывается в оговоренное. Именно в ней имеется основная проблема. Вообще по этой функции видно что сокращенными или неосмысленными именами ты себя сам запутываешь. Этого легко избежать если использовать более говорящие имена в коде.
    Основными элементами состояния вектора являются: блок памяти элементов - elements_memory или memory_block (Второе менее предпочтительно, но тоже понятно. Первое будет понятно очень хорошо); емкость блока памяти - memory_capacity или capacity; длина вектора - elements_count или length или size (последнее менее всего предпочтительно, но канонично относительно реализации вектора); закон роста емкости и закон аллокации элементов.
    Последний в стандарте представлен как std::allocator. Закон роста емкости обычно вписывают прямо в реализацию как функцию роста емкости.
    Ключевыми функциями вектора являются: рост емкости - reserve (только рост, емкость не уменьшается); изменение длины - resize (длину можно и уменьшать); очистка - clear и вставка в конец - push_back.
    Это все - говорящие имена, раскрывающие через себя суть существования конструкций в коде. Я советую тебе стараться тоже подбирать такие имена, которые сразу будут раскрывать смысл существования конструкции.
    Код void pushBack(T value) нужно просто переписать, в текущем коде ломается целостность состояния вектора. Именно поэтому у тебя вектор не работает со строками. Текущий код выполняет buffer overrun прямо на ровном месте потому что ты сперва сделал length++;, а потом уже clon();, в котором цикл вышел за пределы памяти arr.

    T& operator[](int i)
    Очень тяжелый код. Тебе не нужно использовать исключения там где ты можешь справиться конструкциями ветвления. Ситуация в этом коде усугубляется еще и тем, что конструкции ветвления тебе приходится использовать аж дважды: сперва под блоком try, а потом еще и в catch.
    Тебе будет лучше поставить ассерт с проверками индекса, после чего вернуть элемент по индексу.
  • Почему мой вектор не работает со строками?

    @MarkusD Куратор тега C++
    Sergo Zar , я все понимаю, у тебя уникальный стиль исполнения и уникальное видение проблемы передачи смысла кода.
    Только теперь тебе придется выбрать одно из двух. Или всю терминологию этого кода переписать на грамматически чистый английский язык, или разбираться со своей проблемой исключительно самостоятельно.
    Пока я вижу только одну проблему в твоем коде: он не соответствует стандарту, т.к. написан не в соответствии с базовым набором символов.
  • Исходный файл не находит соответствующую функцию, как исправить?

    @MarkusD Куратор тега C++
    zenz , так а ошибки тебе какие транслятор пишет?
  • О безопасности Сбербанк Онлайн - неизменный пароль?

    Drno, смена симки приведет к временной блокировке онлайн банка.
    Когда у тебя крадут карту, тебе достаточно обратиться в банк (как можно скорее) и заблокировать карту + функции онлайн банка. Отделений сбера везде как грязи, буквально в пешей доступности отовсюду.
    Мобильник должен быть зашифрован и защищен биометрией или пином. Иначе онлайн банк держать стоит только на том устройстве, которое никогда не пересечется с картой в физическом мире.
    Онлайн банк сбера защищается пином, смена которого приводит к временной блокировке функций. За это время ты успеешь 10 раз добежать до отделения и заблокировать все что только можно.
    Из разряда паранойи: сделать нечитаемым CVC карты, предварительно сохранив его в защищенном месте и не писать PIN карты на ней же.
  • Как сделать цикл C# для игры?

    4evest GameDev, твои трудности связаны с тем, что ход твоих мыслей идет в неверном направлении.
    Ты думаешь о цикле, тебе нужно думать о законе. О функции, если говорить простым языком.
    Тебе нужно взять бумагу и нарисовать оси Декартовой системы координат. По одной оси отложи деления твоих "+20 в счете", по другой - деления скорости. Нарисуй в этой системе график зависимости скорости от счета. График даст тебе понимание закона изменения скорости. По этому закону ты можешь вывести функцию зависимости скорости от количества очков. Эту функцию ты можешь использовать для определения фактической скорости в любой момент времени.
    Тебе не нужен цикл, тебе нужно уметь пользоваться математикой.
  • Как отсортировать дробную и целую часть числа в C++?

    @MarkusD Куратор тега C++
    Анатолий Плешков, по аналогии с лексикографическим порядком слов.

    Используй std::modf[?] чтобы разбить число на составные части. Каждая составная часть для тебя будет буквой слова при сравнении.
    Дальше ты можешь вести сравнение между буквами одного порядка так, как это делается при лексикографическом сравнении.
    Например, посмотри как я форматы сортирую по их свойствам. Порядок сортировки там тоже является лексикографическим.
  • Statements внутри списка инициализации конструктора?

    @MarkusD Куратор тега C++
    floppa322,
    statement, indirect - это как раз те англицизмы, переведя которые на русский одним словом, только ухудшит понимание, поэтому я бы не стал это делать

    Я полностью соглашусь с res2001 . Ты не иностранец, у тебя есть Русская речь и Русский язык чтобы выражать свои мысли без языковых надстроек. А так, можно через слово, подобно мату, вставлять что-нибудь иностранное взамен родного слова.
    Но дело, конечно, твое.

    естественно может, просто предпочитаю в ооп-стиле писать )

    Только это не будет ООП-стилем. Концепт объектной ориентированности не запрещает использовать глобальные функции и не принуждает все писать только в методах.
    Если ты действительно предпочитаешь писать в стиле ООП, который оперирует сущностями, то вот подходящий пример:
    class Example
    {
    private:
        ExtremelyHeavyObject obj;
    
    public:
        Example()
        : obj{ ExtremelyHeavyObjectBuilder{}
                 .method1()
                 .method2()
                 .method3()
                 .build() }
      {
      }
    };

    Идиома называется Method chaining [?]. У ее применения есть свои особенности.
  • Statements внутри списка инициализации конструктора?

    @MarkusD Куратор тега C++
    floppa322 , есть несколько предложений по оформлению вопроса. Я, кажется, его как-то понял, но хочу устранить неоднозначности.
    Сегодня использование англиканизмов в профессиональной среде трактуется как признак низкой квалификации. Квалифицированный специалист способен объясняться исключительно терминами родного языка.
    Индирект - косвенность. Statement'ы - выражения.
    Когда человек сыпет тяжелыми на слух англиканизмами, его становится тяжело понять. Это заставляет слушателя напрягаться и нервничать. А это уже ведет к обострению общения и может быть воспринято как неуважение.

    По поводу стиля кода. Оформление, откровенно говоря, рваное. Это точно так же заставляет задумываться, вчитываться и искать. Думаю, поэтому у тебя пока еще нет ответов. Лично мне потребовалось 4 раза перечитать код чтобы увидеть в нем инициализатор. Первые три раза я видел просто неправильный синтаксис. В широкой практике инициализатор оформляется примерно схожим образом: блоком по строкам. Посмотри пример.

    По части сложных выражений для инициализации поля. Для инициализации поля ты можешь использовать функции родительского класса (даже методы, т.к. в момент инициализацтора текущего класса, экземпляр родительского класса уже инициализирован), глобальные функции или идиому IILE.
  • Ошибка компиляции для платы Arduino Uno: "CreateFile C:\Temp\arduino_build_357091: The system cannot find the file specified."?

    Алихан Мулаев , прошу повторно ознакомиться с регламентом работы сервиса и устранить нарушения П3.1, П3.4, П3.6 и П3.8 в своем вопросе.
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    @MarkusD Куратор тега C++
    floppa322, хочу обратить твое внимание.
    Класс A использует regex и, чтобы написать тест на него и не ctrl + c / ctrl + v regex можно просто доступиться до публичного regex'а класса A в тесте

    "Класс A использует ..." - это уже описание решения. Решение всегда решает задачу и может быть каким угодно если удовлетворяет условиям задачи. Оно может быть неэффективным или вести к долгосрочным последствиям.
    Описывать желательно саму задачу, для решения которой "Класс A использует ...".

    Для чего тебе потребовалось описанное в вопросе поведение?

    Это означает что меня интересовала именно задача. Сейчас уже не интересует. Сейчас я просто хочу тебя попросить стараться отделять решение задачи от нее самой. Так у тебя появится возможность получать более качественный опыт от других людей.

    Это все относится и ко второму твоему пункту. Там тоже описано решение задачи. Сама задача - это параметры конфигурирования. Тебе нужны какие-то настройки для управления поведением той или иной сущности.
    Для ее решения многие люди действительно заводят отдельный модуль с кучей констант, а потом путаются в них все время. Решение держать конфигурацию внутри типа - не самое удачное. Лучше, минимально, вынести конфиг в отдельную структуру, в которой хоть теми же самыми статическими полями все и определить именно и только для одной сущности. Суть в том, что сущность зависит от конфига, но конфиг не является неотъемлемой частью сущности. Сущностей одного типа может быть много и у каждой может быть свой конфиг. Т.е. тебе лучше сделать WorldSettings и ConnectionSettings, в которых и разместить настройки для World и Connection.
    В бизнесе этот вопрос решается через довольно сложную подсистему конфигурации, которая позволяет управлять настройками игры из самых разных мест.

    ну и даже с приватными статическими константами хотелоь бы, чтобы на каждый тип шаблона копии переменных не создавались, то есть тут уже речь не идёт о красоте синтаксиса

    В этом случае вариант от Sergio является самым лучшим и чистым решением.
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    @MarkusD Куратор тега C++
    floppa322 , шаблон класса - это, прежде всего, шаблон типа. Это еще не тип и работать с шаблоном как с типом невозможно. Шаблон всегда требуется инстанцировать, результатом инстанцирования шаблона типа всегда будет тип, у которого уже можно получить доступ к полям и функциям.

    добавляя "фиктивные" шаблонные параметры как-то слишком костыльно

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

    Расскажи что ты хочешь сделать. Для чего тебе потребовалось описанное в вопросе поведение?
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    @MarkusD Куратор тега C++
    floppa322,
    само наличие блоков try/catch, насколько мне известно, немного замедляет приложение

    А про это много кто слышал и мало кто видел. И еще меньше тех, кому это нужно. Да и нужно это только на платформе x86. Т.е. нужно было, но не нужно уже.
    Платформа x64 всегда и по умолчанию использует вектора прерываний для обработки исключений, буквально в независимости от настроек сборки проекта.

    Сравнительное замедление функционала программы присутствовало на платформе x86 в связи с тем, что в ее бинарный код при трансляции встраивался дополнительный сервисный код для настройки векторов прерываний, работой которых и обеспечивается поддержка исключений. Сам бинарный код никак не замедлялся, просто функционал программы разрежался сервисным кодом, работа которого тоже расходовала время процессора. В большинстве случаев гнаться за этим мнимым ускорением было сомнительной затеей уже тогда, т.к. пользы от исключений было значительно больше.