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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Если даные только для внутреннего пользования, то намного лучше создать структуру Data (имя можно менее общее) или две структуры, если данные нельзя скомпоновать по смыслу в одну структуру.
    Ну и наследовать все классы от QMainWindow это не очень правильно. Т.к. по смыслу в большинстве случаев главное окно одно. Этот класс отличается от обычного QWidget наличием дополнителных компонентов, добавленых по умолчанию (тулбар, например).
    Ответ написан
    2 комментария
  • Почему программисты не любят возврат константных ссылок в C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Что касается кода... Код как код. Если есть реальная потребность возвращать по конст ссылке и без этого не обойтись, так возвращайте. Разумеется, если это не противоречит стандартам кодинга в вашей компании, структуре API и всему такому. В любом случае вы должны просчитать все последствия и варианты использования в реальном приложении. На синтетическом примере этого не увидеть. Я бы если честно предпочел видеть умные указатели, если приложение уж не совсем такое, где надо на всём экономить (а уж чтобы не использовать умные указатели, нужны обоснования и веские).
    Если пользовательский тип поддерживает implicit sharing (можете прочитать про это в доках Qt, у них даже есть специальные классы, которые облегчают жизнь тем, кто хочет создавать свои "copy on write" классы), то его смело можно возвращать по значению. Это же справедливо и для smart pointer'ов.
    Ответ написан
    Комментировать
  • Почему компилятор выдаёт ошибку "not a type" при использовании forward declaration?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    С открытыми полями можно сделать разве что какую-нибудь структурку вроде std::pair, которая допустим откуда-то возвращается в качестве результата (например это результат вычислений и какой-нибудь тэг) или которая используется только в рамках одного класса или просто в одном cpp файле как вспомогательная, но не где более.
    В остальных случаях всегда нормальная инкапсуляция иначе потом будет плохо и вы будете страдать. Представьте ситуацию с большим проектом, когда вам нужно банально поставить бряку и посмотрять кто и когда изменил значение поля. Или например добавить любую логику перед установкой/получением значений (хотя бы банальные нотификации).
    Просто возьмите за правило инкапсулировать и все. Нажать пару кнопок для генерации методов лучше, чем потом страдать.
    Ответ написан
    Комментировать
  • Scrypt - C++ | Библиотека криптографии из litecoin?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Для того, чтобы подключить что-то не header only (в данном случае либу), это нужно собарть или скачать в собранном виде. Затем добавить в CMakeLists нужную директорию с заголовочниками с помощью include_directories, и добавить флаги линкера, например с помощью target_link_libraries. Подробнее читайте доки CMake.
    Ответ написан
  • Как подключить qt к cmake?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Во-первых поставьте системную Qt (погуглилте как это в вашем линуксе сделать), для вас это будет намного проще, чем собрать Qt самостоятельно и сделать все то, что CLion написала вам в лог.
    Во-вторых CMakeLists должен быть примерно таким (ну инклюды там свои пропишите и пр.):
    cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
    
    project(Foo)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} -std=c++1y")
    
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    find_package(Qt5Widgets REQUIRED)
    
    include_directories(${Qt5Widgets_INCLUDES})
    add_executable(Foo main.cpp)
    qt5_use_modules(Foo Widgets Core)

    Но зачем вам страдать с CLion, которая под разработку на Qt вообще не заточена? Не лучше ли взять нормальную IDE вроде QtCreator и не страдать?
    Ответ написан
    Комментировать
  • Где скачать среду для С++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    https://www.qt.io/ru/download-open-source/
    И поставьте уже (хотя бы на виртуалку) линукс и забудьте о проблеммах с установоками/отладокой/кодировоками.
    Ответ написан
    Комментировать
  • Как работать в Visual Studio 2015?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Как в билдере не будет ;) VCL уже давно умер, как и MFC, тут вы правы что перешли.
    VS -- это всего лишь IDE, довольно убогая для плюсов без всяких там решарперов и плагинов. Т.ч. пишут не на VS, а в VS.
    Для C++ вменяемый GUI (и не только) фреймвок -- это Qt. Вот его и надо изучать, если хотите интерфейсы (про QML не забудьте). Я бы сказал, что соотвествующих по уровню альтернатив просто нет. По рынку труда ситуация таже.
    Кстати, для VS есть расширение для поддержки Qt. Я правда не уверен насчет расширений для самых последних версий (т.к. под виндами не работаю), но можете глянуть на сайте.
    Ответ написан
  • Python или C++ для windows приложения?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Есть же cx_Freeze, например. Там все очень просто.
    Ответ написан
    2 комментария
  • Где смотреть конструктор класса?

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

    Отвечая на ваш вопрос, методы тут можно посмотреть: https://doc.qt.io/qt-5/qwidget.html .
    Ответ написан
    Комментировать
  • Что значит использование внутриклассового инициализатора в конструкторе?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Как и в случае с обычной функцией:
    template <class F>
    void foo(F f) {}
    Ответ написан
    1 комментарий
  • Как передать двумерный массив в функцию?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Выше ответиили в комментариях по факту про разные способы от себя добавлю, что вобще лучше использовать std::vector<std::vector<T>> или что-нибудь вроде boost::numeric::ublas::matrix. Тут от целей зависит конечно же.
    Ответ написан
    1 комментарий
  • Можно ли с помощью shared_ptr объявлять массив int?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да.
    std::shared_ptr<int> p(new int[42], std::default_delete<int[]>());

    Как обращаться... Разыменовать и обращаться по индексу. Впорос только зачем.
    Ответ написан
    8 комментариев
  • Почему Qt Creator не видит методы элементов std::vector?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Довольно странно. А проект компилируется?
    В любом случае, проверьте Options->Build & Run->Kits/Compilers/Qt Versions. И все пути.

    PS
    А модель код меняется на вкладке Options->C++->Code Model. Только сомневаюсь что у вас клэнг установлен и все пути прописаны, или что там на виндах надо сделать.
    Ответ написан
  • С++: работа с большими числами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас не такие уж и большие числа. Поищите тут нужный тип: en.cppreference.com/w/cpp/language/types
    Если не подходит, то библиотеки вроде gmp.
    Ответ написан
  • Qt. Как передавать данные между формами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    На самом деле вам не нужно ничего и никуда передавать, как мне кажется. Т.к. вторая форма используется только для создания новых элементов. Но обо всём по порядку. В приведённом фрагменте кода я вижу несколько архитектурных проблем (если не интересно, можете игнорироваться все, кроме пункта 3):
    1) Вторая форма создаётся каждый раз, когда пользователь кликает на кнопку add_item. Это утечка памяти, т.к. все формы будут удалены только после удаления главного окна, но не ранее. Почему бы не создать форму один раз и просто её не показывать на действие? Создали в классе поле QScopedPointer m_addItemDlg (ну или std::unique_ptr), один раз выделили память в конструкторе и радуетесь жизни.
    2) Это не очень хорошо, что Institution хранится в контейнере QList по значению т.к., скорее всего вы не реализовали семантику перемещения и всё это копируется... Хотя бы по этой причине (и по многим другим) стоит подумать о том, чтобы хранить все элементы как shared_ptr.
    3) Наконец-то мы добрались и до вашего вопроса! В Qt есть отличный механизм слотов и сигналов. В вашем случае идея проста: у главной формы надо реализовать слот onInstitutionAdded а у второй формы дописать сигнал institutionAdded и соединить их в конструкторе главной формы. Когда новый объект создан выслать сигнал из второй формы и в слоте главного окна реализовать добавление в коллецию.
    Если же нужно будет редактировать какой-то итем в коллекции, то его конечно лучше передать просто по ссылке перед тем как показать форму. Ну и в этом случае посмотреть уже в сторону Qt model-view.
    4) Название класса второй формы слишком общее и ни о чем не говорит.
    Ответ написан
    2 комментария
  • Qt. Как сериализовать объекты содержащие коллекции?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Для сереализации в Qt есть специальный класс QDataStream. У классов которые вы хотите сереализовать нужно реализовать два оператора (для чтения и для записи):
    QDataStream &operator<< (QDataStream &out, const T &obj);
    QDataStream &operator>> (QDataStream &in, T &obj);
    
    QFile f("path");
    if (f.open(QIODevice::ReadOnly) { // or WriteOnly, or ReadWrite
       QDataStream s(&f);
       T obj;
       s >> obj; // for write s << obj
    }

    Но у вас в коллециях указатели, т.ч. сереализоваться будут адреса, а не сами объекты. Эту проблему нужно как-то решить, т.е. если у вас QList<Institution> lst, то можно просто написатьs << lstдля сереализации, а если указатель, то нет, возможно написать соотвествующий оператор для указателя -- это решение.

    А еще возможно стоит присмотреться к JSON (с пятой версии поддержка входит в стандартную библиотеку Qt) если нужно именно сохранять в файлы, потом читать и иметь возможность поправить руками.

    PS код писал просто по памяти, поэтому может не скомпилироваться :) Но примерно дела обстоят так.
    PPS и лучше используйте какие-нибудь умные указатели вроде QSharedPointer, boost::shared_ptr или std::shared_ptr (с C++11)... Голые указатели уже моветон.
    Ответ написан
    1 комментарий
  • Когда допустимо возвращение ссылки в функции? Когда ссылки на константу?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    P.S. В гуголе не смог найти полный ответ на вопрос.

    Плохо искали, вот первые три ссылки (там объяснено всё и очень-очень подробно):

    https://stackoverflow.com/questions/795674/which-a...

    https://isocpp.org/wiki/faq/const-correctness

    www.bogotobogo.com/cplusplus/object_returning.php

    Там и примеры с операторами есть и пр.
    Ответ написан
  • QML vs QtWidgets?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Это зависит от того, какие конкретно приложения вам нужно писать. Если это что-то под сенсорный дисплей, то выбор однозначен (QML), если под десктоп и это еще одна бухгалтерская программа, т.е. нет много 3D, работы с QGraphicsScene или OpenGL, то использовать QML будет приятнее чем классические виджеты -- писать проще и быстрее, но пока не освоитесь будете плеваться и хотеть бросить :)
    А так-то посмотрите, например на hh.ru процент вакансий где требуется Qt и именно QML, думаю, что стандартные виджеты еще долго жить будут.
    Ответ написан
    7 комментариев