Ответы пользователя по тегу C++
  • Почему не видит перегрузку оператора потока вывода?

    Nipheris
    @Nipheris Куратор тега C++
    Т.к. вы реализуете оператор << в форме внешней функции, то и при доступе к полям объекта нужно указывать конкретный экземпляр объекта, например s.Matrix. Во внешней функции у вас нет и не может быть this, а значит и нет полей объекта в скоупе функции.
    Ответ написан
    Комментировать
  • Как подключить библиотеку к проекту на ubuntu?

    Nipheris
    @Nipheris Куратор тега C++
    Правильный путь: собрать deb-пакет и ставить его.
    Быстрый путь: на целевой машине попробуйте запустить sudo ldconfig.

    Таскать so-шник с бинарником не стоит. Если уж совсем туго, попробуйте слинковать статически.
    Ответ написан
  • Как подключить скачанную библиотеку?

    Nipheris
    @Nipheris Куратор тега C++
    Какая библиотека-то? Возможно в vcpkg есть, для Винды самый нормальный вариант.
    Ответ написан
    Комментировать
  • Что не даёт на C++ писать кроссплатформенные приложения?

    Nipheris
    @Nipheris Куратор тега C++
    • прикладное API различных операционных систем - разное. Если бы API было полностью одинаковое, то тогда операционные системы отличались бы только UX, набором софта и утилит, т.е. вместо Linux/Windows/BSD мы бы имели только Linux в разных дистрибуциях или только Windows в разных дистрибуциях. Ну т.е. по сути одну операционную систему, т.к. раз мы сейчас говорим о разработке прикладного софта, то нас интересует прежде всего API для прикладных приложений;
    • т.к. API различных ОС отличается, требуется создание уровней абстракции, которые нивелируют эти различия. В других ответах уже достаточно примеров, я бы вспомнил например о разделителях в именах файлов;
    • дополнительные уровни абстракции нередко сокращают доступное API, т.к. в большинстве случаев невозможно реализовать самому то, что нет в API какой-то из интересующих ОС. Следовательно, приходится оставлять только те интерфейсы, которые так или иначе есть везде;
    • т.к. абстрагированные интерфейсы из пред. пункта более аскетичны, ими сложнее пользоваться, они дают не все возможности, соотв. какие-то задачи уже нецелесообразно решать кроссплатформенным кодом на базе этих асбтрагированных интерфейсов, проще написать несколько вариантов для разных ОС;
    • оба предыдущих пункта - как достаточно успешные попытки сделать абстрагированные интерфейсы, так и наоборот, написание платформозависимого кода для каждой нужной платформы - удорожают разработку. Везёт только в случаях, когда абстрагированные интерфейсы уже есть и достаточно хорошо выполняют свою задачу, как например Asio. Или хорошие кроссплатформенные стандартые API вроде OpenGL, что делает возможным писать кроссплафторменные игры.
    • разработчику ПО не нужно удорожание разработки там, где это не принесёт ощутимой выгоды.
    Ответ написан
    Комментировать
  • Что нужно знать С++ разработчику для начала работы на фрилансе?

    Nipheris
    @Nipheris Куратор тега C++
    "База" в C++ никому за деньги не нужна, ну кроме американских и европейских студентов-лентяев, которые сами не хотят лабы делать. Если вы хотите заниматься C++ профессионально, ещё и фрилансить, вы должны понимать, как получить законченное решение по ТЗ. Это менее тривиально, чем на других платформах. Вот вам несколько вопросов для самопроверки, расскажете что знаете а что нет:
    • у вас есть большой объём текстовых данных (строк), каких простых правил будете придерживаться, чтобы избегать лишнего копирования содержимого строки;
    • я хочу написать некий фоновый сервис, вытягивающий данные из PostgreSQL и пишущий, допустим, в MongoDB, выполняющий некоторые простые преобразования (неважно какие). Пока будет крутиться на линуксе, но возможно и на виндах придётся запустить у другого заказчика. Какие на вскидку библиотеки для работы с БД будем использовать, будут ли сложности? Как их будем подключать к проекту?
    • чем будем собирать проект из предыдущего пункта?
    • что можете предложить для реализации сетевого обмена? Я хочу чтобы было можно в свой протокол поверх TCP, но возможно захочу ещё HTTP потом.
    • как будете выбирать, слинковать библиотеку статически или оставить зависимость от DLL/SO? Как будете собирать готовые пакеты для деплоя?
    Ответ написан
    7 комментариев
  • Коимпилятор ругается на инициализацю ссылки на функцию как написать что бы не было ошибки?

    Nipheris
    @Nipheris Куратор тега C++
    Вы не сможете сохранить указатель на функцию-член в переменной указателя на обычную функцию. Ваши варианты:
    - сделать dfLineFunc статической/свободной функцией (что было бы логично для функции активации, неужели она у вас от состояния зависит?);
    - сделать dfActive указателем на функцию-член и пользоваться им соответственно.
    Ответ написан
    Комментировать
  • Как реализовать класс стека на указателях и на массиве в одной программе?

    Nipheris
    @Nipheris Куратор тега C++
    Почитайте про полиморфизм вообще, и конкретно про его реализацию для классов в C++ в форме виртуальных функций.
    Ответ написан
    Комментировать
  • Как правильно кинуть исключение в конструкторе класса?

    Nipheris
    @Nipheris Куратор тега C++
    Но я начал читать и узнал про некий эомби-режим объекта, в котором произошел вызов данного exception.

    Не владею такой терминологией. Подробную цитату или ссылку на статью.

    Вероятно там будет о том, что выбрасывать исключение из конструктора можно, но осторожно. В основном все проблемы оттого, что если конструктор выбросил исключение, объект считается недособранным, и деструктор НЕ будет вызываться. Т.е. перед тем как бросить исключение в к-ре вы должны САМИ подчистить всё, что успели насоздавать: https://isocpp.org/wiki/faq/exceptions#selfcleanin...
    Ответ написан
  • OpenGL или DirectX?

    Nipheris
    @Nipheris Куратор тега C++
    Зависит от ваших текущих знаний и пожеланий, особенно от того, насколько вы готовы разбираться с каждой их технологий.

    OpenGL это кроссплатформенное API, раньше было не очень удобно начинать работу с ним на Винде, сейчас доступны различные библиотеки (GLEW, GLFW) и это больше не проблема.
    DirectX возможно даст вам больше возможностей, но там много заморочек с Windows-специфичными вещами, т.к. DirectX работает через технологию COM. Поначалу будет непривычно.

    Я бы на вашем месте начал с OpenGL и посматривал на Vulkan. Знание OpenGL полезно ещё тем, что проще будет использовать родственные API, например WebGL, если захотите писать внутрибраузерный код.
    Ответ написан
    Комментировать
  • Как создаются большие игры на c++ или c#?

    Nipheris
    @Nipheris Куратор тега C++
    1. Разработка крупных игровых проектов имеет как минимум те же особенности, что и разработка крупных приложений вообще. Раз вопрос о движках, не будем рассматривать прочие аспекты, такие как построение игровой модели, графический дизайн игры, написание сюжета и пр. Разработка движка, как большого проекта, требует:
    - умение поставить начальные технические условия, которые будут заложены в архитектуру проекта (чтобы потом не было очень больно это всё менять);
    - умение разбить движок на крупные подсистемы и выстроить между ними необходимые интерфейсы, чтобы каждую из подсистем отдать на разработку в отдельную команду;
    - умение получить MVP в разумные сроки и строить дальнейшую разработку итеративно.

    2. Как большой проект, связанный именно с компьютерной графикой, проект движка предполагает:
    - что немалая часть кода будет писаться с учётом архитектурных особенностей аппаратуры - например, если ваш движок будет пытаться передавать слишком много данных по шине на видеокарту (постоянно гонять геометрию/текстуры), то скорость шины быстро станет узким местом и никакое новейшее оборудование вам не поможет.
    - что графический код рано или поздно может потребовать мелких оптимизаций (вплоть до переписывания супернагруженных мест на ассемблере под каждую поддерживаемую аппаратную платформу);
    - что графический код сегодня требует серьезного понимая физики света и цветовосприятия.

    Для всех тех, кто понимает как реализовать вышеописанное, C++ и C# - лишь инструменты и жизненная необходимость, чтобы получить всё это, поэтому про знание языков даже говорить не буду, это подразумевается.
    Ответ написан
    Комментировать
  • Мёртв ли QML? Стоит ли забыть раз и навсегда о кроссплатформенных гибридных приложениях на Qt?

    Nipheris
    @Nipheris Куратор тега C++
    Моё мнение таково:
    1) популярность QML на "том же Upwork" зависит от популярности C++ на "том же Upwork";
    2) C++ - язык крупномасштабной командной разработки, либо же разработки узкоспециализированной;
    3) заказы на крупномасштабную командную разрабоку всегда будут составлять лишь небольшую часть заказов на Upwork ввиду природы этого ресурса (т.к. на этом ресурсе не только крупные заказы а ЛЮБЫЕ заказы);
    4) вывод: Upwork - плохой критерий оценки пригодности QML для продакшена.

    Что касается React Native - это инструмент для задействования frontend-рабочей силы в сфере, где специалист QML/C++ будет более дорогим. Это разумный выбор для приложений и компаний, где ещё нет C++ разработчиков но есть JS разработчики, и где ещё нет C++ кодобазы, но есть JS, либо ещё нет никакой вообще.

    Примерно с таким же успехом я могу заявить, что Electron - лучший инструмент для продакшен-десктопа. Ну понятно наверное о чём я говорю.
    Ответ написан
    1 комментарий
  • Какую вы знаете литературу о внутренностях С++?

    Nipheris
    @Nipheris Куратор тега C++
    Advanced C and C++ Compiling
    Linkers and Loaders.

    Да, на английском. Советую таки читать в оригинале:
    а) меньше неточностей;
    б) будете привыкать к терминологии, рано или поздно будете понимать быстрее чем в переводе;
    в) не все книги переведены (сильно не все, особенно такие).
    Ответ написан
    Комментировать
  • Как операционная система понимает, сколько нужно очистить память?

    Nipheris
    @Nipheris Куратор тега C++
    Факт 1. malloc и free реализуется не ОС, а рантайм-библиотекой языка C/C++. Да, безусловно, время от времени рантайм библиотека делает системные вызовы для того чтобы получить от ОС адресное пространство, но делается это далеко не на каждый malloc/free.

    Факт 2. Вам нужно чётко понимать, что работаете вы со средствами языка и стандартной библиотеки языка, а не ОС. Если на каком-то устройстве скомпилированная программа на C должна работать без ОС, то и способы реализации функционала malloc/free будут иные.

    Факт 3. Алгоритмы, реализующие работу malloc и free, хранят довольно много служебной информации для себя, в частности размер и положение выделенных блоков. Вы не имеете непосредственного доступа к этой информации, но это не значит что её нет. Её достаточно как минимум для того, чтобы выделять вам новые блоки и корректно освобождать старые. Такие алгоритмы называются менеджерами памяти. Кстати в этой незамысловатой статье на вики написано о так называемой иерархии менеджеров памяти. Если вы ознакомитесь с этим понятием, узнаете наверняка больше, чем из всех ответов вместе взятых.
    Ответ написан
    Комментировать
  • Как сделать запрет на редактирование файла для второго пользователя если его открыл первый пользователь?

    Nipheris
    @Nipheris Куратор тега C++
    https://msdn.microsoft.com/en-us/library/system.io... - значение этого параметра нужно выставить в Read. Не стоит велосипеды городить, стоит изучить стандартную библиотеку.
    Ответ написан
    Комментировать
  • Как создать интерфейс на С++ в VS?

    Nipheris
    @Nipheris Куратор тега C++
    Берёте Qt и пишете. Заодно будет претензия на кроссплатформенность.
    Можно ещё WTL, если уж очень хочется Windows-only и поближе к WinAPI.
    Голый WinAPI не советую.
    Ответ написан
    Комментировать
  • Как подключить dll библиотеку в visual studio (c++)?

    Nipheris
    @Nipheris Куратор тега C++
    Для компиляции:
    1. Необходимо добавить путь к инклудам в список инклуд-директорий компилятора.
    2. Необходимо добавить путь к lib-файлам в список библиотечных директорий линковщика.
    3. Необходимо указать требуемые lib файлы как зависимости вашего проекта.

    В рантайме необходимо положить нужный dll рядом с exe.
    Ответ написан
    Комментировать
  • Как реализовать кроссплатформенное ПО с библиотеками для Windows/Linux?

    Nipheris
    @Nipheris Куратор тега C++
    Как это правильно реализовать?

    Если коротко - то написать разные реализации одинаковых хедеров. Можно линковать статически, можно динамически (разумеется, тут всё-таки придётся пошаманить с макросами, чтобы учесть специфичные для платформы вещи).
    Ответ написан
  • Какую библиотеку сокетов на c++ лучше использовать для связки клиента на js?

    Nipheris
    @Nipheris Куратор тега C++
    boost.asio
    Ответ написан
    Комментировать