Ответы пользователя по тегу C++
  • Как сгенерировать CMakeList.txt?

    Nipheris
    @Nipheris Куратор тега C++
    Вообще CMake-файлы пишутся руками. Генерируются потом проекты/билд-файлы для конкретных тулчейнов. Возможно есть какие-либо конвертеры в CMakeLists.txt, но я не уверен, что они дадут вам хороший результат. Если проектом заниматься собираетесь серьезно, лучше самому разобраться.
    Да, для CLion наличие CMakeLists критично, эта IDE очень тесно интегрирована с CMake и в этом одна из ее киллер-фич. Поэтому, если нет возможности/желания/времени переводить проект на CMake (или вы просто не можете на это повлиять), то либо сами пишите CMake-скрипты лично для себя, либо пользуйтесь другой IDE/редактором. Более конкретные советы сложно дать, не зная проекта и задач, которые вы собираетесь в нем решать.
    Ответ написан
    3 комментария
  • Какую книгу лучше взять для изучение программы visual studio?

    Nipheris
    @Nipheris Куратор тега C++
    Для "изучения" вещей, таких как IDE, в которых и изучать то нечего, есть официальная документация. Официальная документация к продуктам Microsoft, имеющих отношение к разработке ПО (VS, TFS, библиотеки и прочее), находится на специальном портале, называемом Microsoft Developer Network (MSDN).
    Ответ написан
    Комментировать
  • Как сделать Bind по аналогии с QtSignal?

    Nipheris
    @Nipheris Куратор тега C++
    std::placeholders
    btn->onClick = bind(&Player::play, this, std::placeholders::_1);
    Ответ написан
    1 комментарий
  • Как автоматизировать сборку программ (php компонент+soap+git+cmake+vc11+ftp)?

    Nipheris
    @Nipheris Куратор тега C++
    Если прога кроссплатформенная, то https://travis-ci.org/
    Вот мануалы для плюсовщиков: https://docs.travis-ci.com/user/languages/cpp . Можно запускать CMake. Бесплатно - только open-source проекты.
    Генерируется CMake файл

    Странное желание)
    Ответ написан
  • Неявное наследование private ?!?

    Nipheris
    @Nipheris Куратор тега C++
    Вы невнимательно читали про наследование (или читали в плохом источнике).

    Логически (т.е. с точки зрения самой идеи) наследование (причем, любое, public и другие) подразумевает, что реализация базового класса станет частью реализации дочернего. Приватные поля класса - это часть его реализации.

    Технически, наследование в C++ подразумевает наличие подобъекта базового класса в объекте класса-наследника. Т.е. у вас в каждый объект Two помимо его собственных полей (в вашем примере их нет) запихиваются все поля Base (и так с каждым базовым классом, если их несколько), по принципу матрешки. НЕВАЖНО, как указали уже в первом ответе, что вы не имеете к ним доступ из класса-наследника. Важно, что они есть, и методы класса Base могут ими спокойно пользоваться, чтобы выполнять свою работу.
    Ответ написан
    Комментировать
  • Как преобразовать 1 байт и 0,5 байта в 1,5 байта(Более подробно в описании)?

    Nipheris
    @Nipheris Куратор тега C++
    Я предполагаю нужно выделить 2 байта и записать туда их как-то.

    Вам нужно считать эти два байта как единое целое (например, если вы используете потики, то считать нужно в short int), либо, если это невозможно, то тогда считать байты по отдельности и объединить их в int16_t, как советует Denis Zagayevskiy . И в том и в другом случае вам нужно понимать, что такое порядок байт в записи числа. Когда вы поймете, что такое порядок байт, то поймете, в чем суть вашего вопроса. Следить за ним нужно, т.к. в файле этот порядок байт может быть одним (и он определяется форматом файла), а на вашей машине он, в теории может быть другим, и вам нужно это понимать, когда вы будете склеивать вам int16_t. Если вы не будете его склеивать, а будете считывать сразу в int16_t, то вам нужно сверить порядок байт на вашей архитектуре и в формате файла.

    И да, числа в современной выч. технике:
    а) хранятся в двоичной системе счисления - т.е. все, что вы видите в дебаггере или в вашей программе - это целиком зависит от того, как функция преобразования числа в строку (которую вы потом видите) выбирает символы для записи числа. В большистве таких функций можно указывать систему счисления. Напишите сами такую функцию,чтобы понять, о чем речь;
    б) их размер в памяти/регистрах процессора выровнен на размер байта (как правило это 8 бит). Байт - это квант адресации и обработки данных, поэтому говорить, что число занимает 0.5 байта не вполне корректно с практической точки зрения, т.к. байт занять можно только целиком.

    Т.к. про 0.5 байт вы упомянули скорее по ошибке, я думаю битовые поля вам не нужны.
    Ответ написан
    1 комментарий
  • Какие знания нужно иметь в C++ для перехода на приложения с GUI?

    Nipheris
    @Nipheris Куратор тега C++
    Нужны знания о том, как правильно пользоваться сторонними библиотеками (любыми), написанными на C/C++ - как их подключать в проект и как работать с их API так, чтобы не наломать дров. Для этого необходимо понимать управление памятью в C++, понимать что такое жизненный цикл объекта и еще некоторые мелочи (например, что не стоит выделять память в одном двоичном модуле, а высвобождать в другом).
    Ответ написан
    1 комментарий
  • Что написать на C++ для тренировки?

    Nipheris
    @Nipheris Куратор тега C++
    P.S.: убедительная просьба не предлагать написать консольные калькулятор, конвертер и прочую мелочь.


    Напишите не консольный, а с рисованием графиков. Да и к совету Александр Таратин насчет производной советую прислушаться. А если для вас это мелочь, найдите производную не численным, а символьным путем (как делает Maple, например). Много интересного ждет вас.
    Ответ написан
    Комментировать
  • OpenGl камера нужна помощь?

    Nipheris
    @Nipheris Куратор тега C++
    Во-первых, условимся, что в рамках вопроса не делаем различий между OpenGL и DirectX. Будем называть их "графическим API".
    Во-вторых, будем считать это графическое API низкоуровневым (т.е. таким, как OpenGL и DirectX). Графические движки, где есть понятие сцены и камеры не рассматриваем в принципе.

    Итак, с математикой вам все равно придется разбираться по книгам (ищите об операциях над матрицами и векторами), поэтому попробую подсказать с концептуальной точки зрения.
    Самая главная истина, которую вам сейчас нужно понять:

    Для графического API НИКАКОЙ КАМЕРЫ НЕ СУЩЕСТВУЕТ.

    Для графического API существуют только примитивы (треугольники, линии, точки), которые вы хотите нарисовать, состоящие из вершин с трехмерными координатами и набор математических преобразований, которые вы хотите выполнить над этими вершинами ПЕРЕД тем, как они начнут реально рисоваться на экране (т.е. перед их растеризацией). ВСЁ. Все, что для вас выглядит как движение/поворот объекта в игровом мире ("мировые преобразования"), и движение/поворот камеры ("видовые преобразования") - лишь результат того, что вектора, задающие вершины объекта (например, кубика) предварительно умножаются на нужную, рассчитанную вами матрицу.

    Лет 10-15 назад такая матрица отдавалась непосредственно графическому API через специальные вызовы (когда видяхи уже умели делать T&L https://en.wikipedia.org/wiki/GeForce_256 , но еще не умели шейдеры), сегодня умножение вектора на матрицу - всего лишь одно из множества различных преобразований, которые можно выполнить в векторном шейдере.

    Теперь читайте про то, как эти матрицы используются и рассчитываются. Когда поймете матчасть, гляньте библиотеку GLM (раз уж у вас указано C++ и OpenGL) - она поможет не делать вам рутинную работу.
    Ответ написан
    Комментировать
  • Причина бесконечного вывода несвязанных символов?

    Nipheris
    @Nipheris Куратор тега C++
    У вас полнейший ад в плане работы с памятью. Вообще непонятно зачем эта свистопляска с указателем на string и массивом, непонятно даже что вы хотите вернуть из функции поиска - указатель на string или на массив string. Так или иначе, и то и другое - локальные переменные, и пытаться работать с указателями на них после завершения работы функции - грубая ошибка (точнее, ошибка пытаться возвращать указатель на локальную переменную из фукнции и думать, что это будет работать).
    Укажите, что вы хотите сделать, т.к. сложно даже понять решаемую задачу (видимо, что-то где-то найти?).
    Ответ написан
    Комментировать
  • Какую выбрать среду для написания кода на С++?

    Nipheris
    @Nipheris Куратор тега C++
    > почему там все так заморочено?
    Вы бы говорили с точностью до наоборот, имея проект с около 10к файлов исходного кода, а в солюшене 70 проектов. Вы бы говорили "Спасибо, VS, хоть как-то помогла разобрать это все". Это проф. инструмент, к сожалению он не позиционирован для обучения. Это факт.

    Для обучения берите удобный редактор (Sublime?) и вызывайте компилятор руками (из ком. строки). Много чего поймете полезного (придется, иначе не получится ничего). Как include-директории передавать и всякое такое. Как задолбаетесь это делать - напишите sh-ник/bat-ник. А вот только потом вы и поймете, зачем вам Студия, и что она может/не может облегчить.
    Ответ написан
    9 комментариев
  • Какой язык выбрать под Backend высоконагруженного rest-сервиса?

    Nipheris
    @Nipheris Куратор тега C++
    забрать данный с БД, передать на клиент, получить запрос от клиента, выполнить несложную логику, сохранить в БД, передать ответ

    По вашему описанию БД должна быть узким местом. А если узлов с базой много, почему не размножить бэкенд-сервера?
    Ответ написан
    1 комментарий
  • Есть ли проекты на С++, исходники которых стоят внимания, а то есть проекты написаны качественно и там есть чему поучиться?

    Nipheris
    @Nipheris Куратор тега C++
    JSON Spirit (на гитхабе оригинала нету, только зеркала от других разработчиков)
    SOCI
    cpp-netlib
    Драйвер Монги для C++
    mapbox-gl-native

    По поводу сборки: сейчас в плюсах без CMake никуда. Если хотите собирать чужие проекты и разрабатывать свои - стоит познакомиться. Из перечисленного списка почти все умеют им собираться. В более старых проектах популярны autotools и классические make-файлы, еще можно встретить SConstruct.
    Ответ написан
    Комментировать
  • Как забиндить classmember handler для boost::asio?

    Nipheris
    @Nipheris Куратор тега C++
    99%, что удаленная функция - это конструктор копирования.
    По смыслу объекта сокета можно догадаться, что копировать его не стоит (т.к. так или иначе он представляет собой обертку над системным ресурсом). Раз его копировать не стоит, используйте указатель на сокет вместо самого сокета. Например, shared_ptr, вот как тут советуют: stackoverflow.com/questions/5425666/passing-around... .

    Вообще, привыкайте, что по значению сложные объекты передаются довольно редко (почти никогда), т.к. передача по значению противоречит сути этих объектов - существовать строго в том количестве, в котором их насоздавал программист.
    Ответ написан
    1 комментарий
  • Какая математика нужна системному программисту?

    Nipheris
    @Nipheris Куратор тега C++
    Любому программисту будет полезна дискретная математика. Системный программист тут особо не отличается (ему важнее алгоритмы и структуры данных).

    Глубокий матан нужен тем, кто занимается расчетами и моделированием. Ну или областями, где задействована физика, например реалистичной графикой.

    То, что математика полезна в целом, и "ум в порядок приводит", я думаю и так понятно.
    Ответ написан
    Комментировать
  • Как сделать экпортируемую dll функцию без хедера членом класса?

    Nipheris
    @Nipheris Куратор тега C++
    Совершенно верно Петр говорит, this в мешке не утаишь).

    Кроме того, если либа грузится через LoadLibrary, т.е. связывания на этапе компиляции нет, то и вызывать ее надо через указатель, а тогда без обертки соответствие между какой-либо функцией, объявленной в классе (пусть даже это будет статическая функция) и этим указателем не проставить в принципе, т.к. где-то должна произойти косвенная адресация и передача управления в DLL.
    Ответ написан
    Комментировать
  • С чего начать изучение Gamedev'а?

    Nipheris
    @Nipheris Куратор тега C++
    1) алгоритмы и структуры данных: списки, очереди, деревья, графы и операции со всем этим;
    2) линейная алгебра и геометрия: операции над матрицами и векторами;
    3) компьютерная графика: растр и вектор, представление изображений, трехмерных объектов и сцен; архитектура графического железа и конвейер рендеринга (раз игры, то упор в realtime-графику, а не в фотореалистичную), шейдеры; конкретные графические API: OpenGL 4 и DirectX 11, на будущее - Vulkan и DirectX 12;
    4) С++: основные конструкции языка, ООП, элементы ФП, стандартная библиотека (не пренебрегайте ей), затем шаблоны;
    Ответ написан
    Комментировать
  • Как реализованать подобный интерфейс на Qt Widgets?

    Nipheris
    @Nipheris Куратор тега C++
    И еще разок вспомним о QML.

    Не могу вам 100% гарантировать, что он больше вам подойдет, но это весьма вероятно.
    Ответ написан
    Комментировать
  • Как генерировать код из XML?

    Nipheris
    @Nipheris Куратор тега C++
    В xml(xsd) список некоторых элементов, из которых нужно сгенерировать много кода на C/C++, который руками писать (и править) долго, муторно и чревато опечатками.

    Ну тогда берите XSLT и сможете сгенерить все что захотите, хоть сказку. Ничего более конкретного посоветовать не могу.
    Ответ написан
    Комментировать