Ответы пользователя по тегу C++
  • Как выполнять С89/C++ код в Visual Studio Code?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Верно пишут. Без компилятора никак. Качайте SDK и/или плагин, или устанавливаете компилятор отдельно.
    Компилятора в винде нет встроенного, насколько мне известно.
    Ответ написан
    Комментировать
  • Есть ли способ импортировать установленные через conan.io библиотеки напрямую без указания пути в include?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Тут, на самом деле, необходимо чётко определить границы.

    Есть ООП как парадигма программирования. Одна из концепций ООП называется полиморфизм. Существуют различные реализации этой концепции в языках программирования.

    В C++ есть несколько реализаций полиморфизма. Вам, на данном этапе, скорее всего интересен только полиморфизм, основанный на подтипах. Это означает, что вызывающий код может работать с набором типов из определённой иерархии, без знания о том, какой это конкретно но тип: базовый или подтип.

    Касательно интерфейсов: в C++ их нет на уровне языка, как отдельной сущности. Однако же разница между интерфейсом и абстрактным классом никуда не делась.

    Пример "обычного полиморфизма":
    // Это "интерфейс", который представляет собой набор операций, которые можно произвести над объектом
    // В данном случае, по объекту можно постучать
    class IKnockable {
    public:
        virtual ~IKnockable() = 0;
    
        // Само по себе действие: "постучать"
        virtual void knock() const = 0;
    };
    
    // Реализация интерфейса классом Door
    class Door : public IKnockable {
    public:
        // ...
        void knock() const override { std::cout << "door" << std::endl; }
        // ...
    };
    
    // Реализация интерфейса классом Window
    class Window : public IKnockable {
    public:
        // ...
        void knock() const override { std::cout << "window" << std::endl; }
        // ...
    };
    
    // ...
    
    // Какая-то функция, которая может постучать  по каждому объекту из списка, 
    // не имея представления о том, что же это за объект
    void knock(const std::vector<std::shared_ptr<IKnockable>> &knockableObjects) {
        for (auto &&knockableObject : knockableObjects) {
            knockableObject->knock();
        }
    }
    
    // ...
    
    std::vector<std::shared_ptr<IKnockable>> v = {std::make_shared<Door>(), std::make_shared<Window>()};
    knock(v); // Сначала напечатает "door", потом напечатает "window"


    Ответ на ваш изначальный вопрос: это понятия из разных областей, одно из теории типов, другое из языков программирования. Интерфейс -- это одно из средств в языках программирования, для реализации определённого типа полиморфизма.
    Ответ написан
    3 комментария
  • Как посмотреть код STD C++ в Visual Studio?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Наверно с ctrl + click должно работать (или из контекстного меню тоже самое). Ну и всегда можно пойти и посмотреть исходники стандартной библиотеки по пути установки MSVC, или кликнув на инклюд. Можно ещё в онлайн компиляторах, наверно, вывести файл исходников, если студия не установлена.
    Ответ написан
    Комментировать
  • Есть в ли в C++ библиотека для ассоциативных массив не менее удобная чем на PHP такие массивы?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Для вашей цели могут подойти различные JSON библиотеки. Например вот эта: https://github.com/nlohmann/json#examples
    Ответ написан
    Комментировать
  • Кто/Как отвечает за синхронизацию объявлений между “.cpp” и “.h” файлами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Если функция объявлена, но не определена, то будет ошибка линковки. Если даже не определена, или нет подходящих сигнатур, то ошибка компиляции.

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

    На практике, если вы что-то забыли, то получите ошибку сборки программы (на одном из этапов). Если проект большой и сложный, то он может и собраться, но работать очень неожиданным образом, например если линковщик нашёл где-то символы, но не там где нужно :)

    Ну и рекомендую почитать любую книгу по C++, всё что я написал выше, будет в первых главах книги.
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы окно открывалось один раз и единственный(как при регистрации)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В Qt есть класс QSettings. Он предназначен для хранения настроек приложения. Можно использовать его, в документации есть примеры использования. Алгоритм таков:
    1) Проверяете есть ли некоторое значение в настройках
    2) Если есть, не показываете окно. Если нет, то показываете окно и устанавливаете значение.

    Если действительно нужен механизм регистрации, то тут всё несколько сложнее.
    Ответ написан
    4 комментария
  • Какой контейнер/методология сможет заменить Map из JavaScript?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Насчёт JS не знаю, но, судя по описанию, вам необходима структура данных, которая называется FlatMap (есть например в бусте), ну или по крайней мере, сильно на неё похожая.
    В общем и целом, можете написать свою структуру данных вроде std::vector<std::pair<KeyType, ValueType>>. Ну а базовый контейнер выбрать в зависимости от того, какие операции будут применяться к структуре наиболее часто, я просто вектор для примера привёл.

    К слову
    В QList индексы просто по порядку должны идти, без пропусков и не получится сразу взять и вставить на 42 место.

    Подразумевает наличие 42 элементов (не важно пустых или нет), что вам, кажется, не надо. Поэтому, уточните плз, какую задачу вы решаете и какие реально есть требования к структуре данных.

    upd.
    Посмотрел доку на JS, похоже там реально flat map.
    Ответ написан
  • Как узнать позицию элемента в массиве?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Добавьте ещё одну переменную под число, и изменяет её там же, где max. Что-то вроде num = arr[i].
    Ответ написан
    Комментировать
  • Почему нельзя передавать лямбду как аргумент шаблона?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Ну для POD должно как-то так работать:
    anketa a;
    
    std::ofstream out(file_name);
    out.write(reinterpret_cast<char*>(&a), sizeof(a));
    
    // ...
    
    std::ifstream in(file_name);
    in.read(reinterpret_cast<char*>(&a), sizeof(a));

    Но у вас там std::string есть, а его надо в char* преобразовать чтобы так записать. Это больше чем одна строчка. Поэтому, такие чтение/запись надо выносить в отдельные функции.
    Ответ написан
    Комментировать
  • Создание онлайн компилятора?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Например вот это: https://github.com/mattgodbolt/compiler-explorer
    Ну и сам проект онлайн: https://godbolt.org/

    К слову, большая часть профессиональных C++ разработчиков пользуются этим инструментом.
    Ответ написан
    Комментировать
  • Как создать .exe файл со встроенными библиотеками в CodeBlocks, чтобы была возможность открыть его на другом компьютере?

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

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Написать отрисовку стрелки самому: https://doc.qt.io/qt-5/qtwidgets-graphicsview-diag...
    Тут весь пример: https://doc.qt.io/qt-5/qtwidgets-graphicsview-diag...
    Ответ написан
    Комментировать
  • Какие требования для джуна на с++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Заходите на сайты с вакансиями, например hh.ru и смотрите по требованиям. Можете ещё хабр почитать, там есть статьи, которые описывают опыт трудоустройства именно джунов на C++.

    Стоит отметить, что начинающий программист -- это не новичок. Это специалист с опытом работы от года и/или релевантным опытом в разработке ПО, полученном, допустим в разработке своих проектов или проектов с открытым исходным кодом.

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

    А так, можете написать что-то уровня fizzbuzz или binary search, понимаете O(n), знаете, что такое size и capacity у std::vector и зачем это надо, слышали про cache line краем уха, понимаете чем отличаются map и unordered_map, у вас есть парочка своих проектов на гитхабе и вы немного использовали ООП (кстати, ООП -- это не только про классы)... Смело можете пробовать. По крайней мере, я бы с большой вероятностью принял бы на работу такого джуна.
    Ответ написан
    3 комментария
  • Как работать с библиотекой CImg C++?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Как-то так
    #include <QApplication>
    #include <QMessageBox>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QMainWindow mainWindow;
    
        auto res = QMessageBox::question(&mainWindow, QMainWindow::tr("Just in case"),
                                         QMainWindow::tr("Are you sure?"));
        if (res == QMessageBox::Yes) {
            mainWindow.show();
            return a.exec();
        } else {
            return -1;
        }
    }

    Смысл в том, что у вас первое окно -- это модальный диалог (наследник QDialog, допустим). У него есть метод exec обычно, который возвращает результат (например согласился пользователь или нет). На основании результата и решайте, что делать дальше: показать окно или выйти из программы.
    Ответ написан
    Комментировать
  • Как работать с usb устройством в JAVA и С++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Ну посмотрите в сторону SDK, который, вероятно, поставляется с устройством (классом устройств), сканером штрих кодов, если я верно понял. По факту это и будет некоторой обёрткой над драйвером.

    Если вам прям в деталях надо, то спецификация USB 2.0 около 600 страниц, можете изучить. Но я бы, на вашем месте, погуглил кроссплатформенные решения для работы с USB девайсами (готовые библиотеки). Там обычно есть примеры, которые помогут разобраться. Ну это если SDK нет.

    Ну а если у вас просто какая-то кастомная железяка, которую надо подключить к сканеру, то надо смотреть, какой софт на этой железяки и как её вообще программировать.
    Ответ написан
    Комментировать
  • Как передать параметр в функцию класса родителя в Qt C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас есть несколько вариантов:
    1) Использовать старый синтаксис соединения и сделать show_add_btn слотом
    2) Использовать qobject_cast в лямбде для преобразования объекта к нужному типу
    3) Использовать static_cast для преобразования в лямбде, если вы уверен, что там именно тот объект
    4) Переработать архитектуру, чтобы касты не были нужны совсем. Например, чтобы слот присоединялся к сигналу какой-нибудь фабрикой или её аналогом. Я голосую за этот вариант.
    Ответ написан