Ответы пользователя по тегу C++
  • Как переместить функцию в поток QThread?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В случае Qt можно просто использовать QtConcurrent::run: doc.qt.io/qt-5/qtconcurrentrun.html
    Ответ написан
  • Как обработать аргументы при вызове функции?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В первой ветке if у вас функция ничего не возвращает. Возможно, причина в этом. Возвращать можно любое неверное значение для теста, допустим, -1.
    Ответ написан
    Комментировать
  • Как выполнить некоторый код при выходе из функции?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Не вопрос (C++17, свёртка):
    template<typename... Funcs>
    auto compose_sq(Funcs&&... funcs)
    {
        return [=]{ (std::invoke(funcs), ...); };
    }
    
    int main()
    {
        auto f1 = []{ std::cout << "f1" << std::endl; };
        auto f2 = []{ std::cout << "f2" << std::endl; };
        auto f3 = compose_sq(f1, f2);
        f3();
    
        return 0;
    }

    Ну а если нужно сохранить результат возврата значения первой функции, то придётся ещё немного кода написать. Думаю, что общее направление вам понятно. Если что, то дополнительную информацию можно найти тут: https://en.cppreference.com/w/cpp/language/fold
    Ответ написан
  • Как передать оператор разыменования в функцию?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Короче будет только с библиотекой range (из буста, или range-v3).
    К слову, вам надо проверять указатель на null, хотя бы ассертом, если уверены, что там всегда валидные указатели.
    Кроме того, вы по сути копируете объекты. Это дорого. Если этого не планировалось, то советую использовать интеллектуальные указатели или reference_wrapper. К тому же, в современном C++ практически нет необходимости использовать сырые указатели.
    Ответ написан
    Комментировать
  • В какой среде разрабатывают интерфейс для программ на C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вообще, для C++ и альтернатив-то вменяемых нет. Только Qt.
    Ответ написан
  • Как написать функцию циклического сдвига массива?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Реализовать функцию типа int,

    Это означает, что функция должна int возвращать? Если да, то зачем?
    Какие параметры передать в функцию, если из функции main я считываю сам массив и число сдвига?

    Так эти параметры и передавайте.
    Можно ещё сделать так, как std::rotate реализована. Но это немного сложнее для новичков.
    Ответ написан
    Комментировать
  • Какие книги по С++17 посоветуете?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Только документация + стандарт. Вот тут лучше всего: https://en.cppreference.com/w/cpp , даже примеры есть. Ну и смотрите на вики или где угодно, что добавилось в 17ом стандарте.

    PS
    А интеллектуальные указатели добавили в 11 стандарте в стандартную библиотеку.
    Ответ написан
    Комментировать
  • Какие отличия между разными версиями компиляторов?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    1) Отличия смотрите в описаниях к релизам. Там всегда пишут, что пофиксили/добавили/убрали.
    2) Для кроссплатформенности, компилируйте с флагами -pedantic -Wall -Wextra (у студии должны быть подобные флаги).
    3) Чем новее компилятор, тем лучше: больше оптимизаций, багфиксов (да, и новые баги), поддержка фич из новых стандартов C++ и т.п.
    4) Да, достаточно понимать как разрабатывать ПО и уметь и это делать. Язык -- всего лишь инструмент, но на эффективность разработки он влияет. Т.ч. мастерски владеть инструментом тоже необходимо.
    Ответ написан
    Комментировать
  • Как скопилить кросс дистрибутивний нативный node.js модуль?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Два варианта:
    1) Линковать с флагом -static-libstdc++. В этом случае статическая версия либы будет влинкована в исполняемый файл. Все остальные зависимости можно тоже линковать статически. Что обычно и делают для плагинов. В общем и целом, это очень хороший вариант.
    2) Поставлять нужную версию либы с приложением, и линковать с '-Wl,-rpath,$ORIGIN/relative_path_to_lib_dir'. Тоже самое для остальных зависимостей.

    Первый вариант может не сработать по некоторым причинам (скорее всего, вас это не коснётся):
    1) Если не известно, с какими флагами хост-приложение выполняет dlopen на ваш плагин. Это можно обойти введением ещё одной прослойки без лишних зависимостей, которая будет правильно выполнять dlopen.
    2) Лицензии. Что-то может быть нельзя линковать статически, или можно, но с невыгодными для вас условиями.

    Во втором варианте тоже могут быть проблемы. Если хост-приложение уже загрузило зависимость, имя и версия которой совпадает с именем и версией зависимости, которая нужна вашему плагину, то зависимость для вашего плагина загружена не будет. Это не проблема, если зависимости не отличаются. Но вот если вы патчиили свои зависимости, то вам придётся их переименовывать и использовать флаг soname. Но опять же, не уверен, что вас эта проблема коснётся.

    Добро пожаловать в мир C++ :)

    PS
    Попробуйте написать ваш плагин на Rust, например. Жизнь скорее всего станет легче.
    Ответ написан
    Комментировать
  • Почему программа ломается при освобождении памяти?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Для начала, я бы убрал явное использование new/delete. Это всё-таки C++. У вас есть класс std::string, его и используйте везде (например при возврате значений). Этот класс предоставляет метод reserve, чтобы выделить необходимое количество памяти. У него есть метод data, если необходимо передать в C API char*.

    Вполне возможно, что у вас не крэш, а программа просто висит на send/post, ожидая ответа. Это тоже стоит проверить.
    Ответ написан
    Комментировать
  • В чем ошибка в исходном коде, и есть ли она?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    [test.cpp:3]: (warning, inconclusive) Member variable 'TLibrary::hModule' is not initialized in the constructor.

    В C++ всё (почти) необходимо явно инициализировать, а то потом можно получить очень интересные проблемы. В конструкторе необходимо инициализировать все поля класса в порядке объявления. Начиная с C++11 можно инициализировать по умолчанию через равно в момент объявления.

    [test.cpp:6]: (style) Class 'TLibrary' has a constructor with 1 argument that is not explicit. Such constructors should in general be explicit for type safety reasons. Using the explicit keyword in the constructor means some mistakes when using the class can be avoided.

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

    (warning) The class 'TLibrary' has 'copy constructor' but lack of 'operator='.

    Золотое правило: сами реализовали деструктор, конструктор копии, оператор копирования, конструктор перемещения или оператор перемещения, задумайтесь о том, что вам возможно надо реализовать все пять методов.
    Ответ написан
  • Почему не работает new c++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В классе User не реализован метод:
    virtual int compare(Comparator *t)=0;
    C++ поддерживает ковариантность типов возвращаемых значений, но не ковариантность (контрвариантность) аргументов функций, для полиморфных методов.
    Ответ написан
  • Размер массива в C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Это же C++, а следовательно, у вас должна быть очень хорошая причина, чтобы не использовать std::vector в данном случае.
    Ответ написан
  • Как задать точку останова при большом иcпользовании RAM?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Кастомные аллокаторы и/или бряки по условию.
    Ответ написан
    Комментировать
  • Как Ускорить выполнение функции вызвоной по укозателю?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Я советую вам собрать приложение в релизном режиме (со всеми необходимыми оптимизациями) и после этого уже профилировать. Профилирование не в релизном режиме не показательно.
    Ну и в целом, вам верно ответили, что вызов функции предполагает большие расходы. Другое дело, что компиляторы очень умные и могут много что оптимизировать. Разумеется не всё.
    Ответ написан
    Комментировать
  • Как в моём классе реализовать перевод из шестнадцатеричной системы счисления в восьмеричную?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Самый простой вариант (и супер не эффективный):
    std::string decString("10");
    	
    std::stringstream buf;
    buf << std::oct << std::stoi(decString) << std::endl;
    	
    std::string octString = buf.str();
    std::cout << octString << std::endl;


    Вообще, чтобы число перевести десятичное число, например в восьмеричную систему, можно написать простой цикл на 4-5 строчек.
    Ответ написан
    Комментировать
  • Как добавить экран приветствия/загрузки с прогресс баром?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Общий подход таков:
    1) Выносите загрузку данных в отдельный поток
    2) Показываете заставку или что угодно
    3) В цикле ждёте, пока загрузка данных не завершится, не забывая обновлять индикатор загрузки и "пропускать" события оконной системы, чтобы заставка не подвисала и обновлялась. Тут вам понадобится какой-то аналог цикла обработки событий.

    Это самый простой подход. Тут возможны различные вариации.

    К слову, если вы используете какой-то GUI-фреймворк, то там наверняка реализован подход, сродни описанному выше. В SDL, я почти уверен event loop присутствует в каком-то виде. Копайте в эту сторону.
    Ответ написан
    2 комментария
  • С чего начать изучение C++, если есть опыт программирования на других языках?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Попробуйте погуглить что-то вроде "C++ crash course", это может помочь.
    Вообще, С++ на PHP не похож совсем. И ваше непонимание того, что такое int это доказывает. Непонимание будет только расти, после того, как вы узнаете о ссылках и указателях, управлении ресурсами, сборке и дистрибуции проекта и т.п. Вот если бы вы после пхп, руби или пайтон начали изучать, то таких бы проблем не возникло.
    Так что, скорее всего проще и правда взять хорошую книгу (можете погуглить, таких вопросов много), и изучать C++ с нуля. Общий опыт программирования вам безусловно поможет, но повторюсь, языки разные.
    Ответ написан
    Комментировать
  • Можно ли как-то в c++ узнать принадлежность объекта классу?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Зачем вам это? Есть полиморфизм, а касты -- это плохой стиль почти всегда.

    Можно много чего использовать, в том числе и тэги. В базовом классе создаёте перечисление, где каждый элемент -- тип наследника + 1 элемент на тип базового класса. В базовом классе определяете виртуальный метод вроде type() и реализуете его для всех наследников.

    Но перед тем, как сделать это, хорошо подумайте над тем, надо ли оно вам. Про SOLID почитайте, в особенности про букву L.
    Ответ написан
    Комментировать
  • Как определить, что утекает память? Как получить размер памяти, занимаемой экземпляром класса?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да есть: valgrind и аналоги.
    Ответ написан