• Можно ли с помощью 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 комментариев
  • Какие вопросы задают на собеседование программисту C(Си), не С++?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Это будет сильно зависеть от предметной области и вакансии. Благо там по самому языку C особо и спрашивать нечего -- K&R, ну + мб пару хаков. Cети могут спросить, что-нибудь по осям, про какие-нибудь железяки хитрые, что-то из криптгографии... Как я уже и говорил, будет от вакансии зависеть, так сложно угадать.
    ООП и паттерны почти точно не спросят.
    Ответ написан
    Комментировать
  • Почему 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
    Senior software engineer (C++/Qt/boost)
    По-моему тут уже много таких вопросов. Поиск по сайту пробовали?
    Если пишете что-то кроссплатформенное (win, mac, linux имеется ввиду) и именно десткоп, то тут выбор очевиден - Qt (C++). Для линукса тоже, хотя тут есть альтернативы конечно, но на мой взгляд достаточно убогие. Под винду C#. Под мак swift, objective-c. Т.ч. по языкам: C++/C#/swift.
    Что вам выбрать... Я не знаю. Зайдите на hh.ru посмотрите вакансии в вашем городе, почитайте требования и пр. Посмотрите стажировки в крупных компаниях -- это очень хорошо для новичков.
    Ответ написан
    Комментировать
  • С++: работа с большими числами?

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

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Кто-то за вас будет разбираться... серьезно?
    Вот посмотрите да разбиритесь: https://en.wikipedia.org/wiki/Bitwise_operation . Тем более, что вы лучше понимаете что там делается и зачем в плане бизнес-логики.
    Ответ написан
    Комментировать
  • 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 комментариев
  • Когда ооп быстрее процедурного?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Выше всё верно написали, но перед тем как просто следовать рекомендациям, хорошо бы ответить на вопрос: "зачем?". Все дело в основном (хотя бывают и другие случаи) в скорости компиляции программы. Поменяли что-то в заголовочнике, который включен в 100500 других заголовочников и ушли отдыхать на 15 минут, пока всё это компилится в 8 потоков :) Неприятно в общем. Т.е. золотое правило: чем меньше включено в заголовочник, тем лучше. Правда, в 17ом стандарте будут модули и эта проблема решится (ну всё равно тонны легаси никто сразу вот так прям не портирует, так что еще лет 5-10 эти знания будут актуальны).
    Помимо этого, для увеличения скорости компиляции можно использовать pimpl (но осторожно, это не основное предназначение этой техники!) и программы вроде ccache (как, вы всё еще не на линуксе?).
    Ответ написан
    Комментировать
  • Как найти корни уравнения?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D...

    Раздел "методы решения".
    Ответ написан
    Комментировать
  • Ставить ли фигурные скобочки?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Ответ на этот вопрос не так однозначен. Существуют стандарты оформления кода, согласно которым должен быть отформотирован весь исходный код. Это актуально и для коммерческих компаний и для открытых проектов. Поэтому "хорошо" или "плохо" сказать нельзя, нужно говорить "соотвествует стандарту или нет". Можете для своих личных проектов выбрать какой-нибудь стандарт кодирования и следовать ему. Вот пример стандарта: https://wiki.qt.io/Coding_Conventions . Помимо этого существуют программы, которые позволяют отформатировать весь код согласно набору правил (astyle, clang-format, uncrustify etc.). Использовать их далеко не всегда удобно, так как зачастую форматирование может быть не стандартным чтобы повысить читабельность кода, но в общем случае нормально.

    Что касается вашего примера, я предпочитаю не ставить лишние скобки для тела if в одну инструкцию:

    // OK
    if (a > 3)
        ++a;


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

    if (a > 3) ++a; // Как поставить бряку на "++a"?

    Что касается циклов, то с for лучше всегда ставить скобки, т.к. некоторые IDE в режиме отладки вроде VS2008 (а возможно и более старших версий) не умеют заходить в тело однострочного цикла без скобок.
    Ответ написан
  • Как правильно готовить Clion или Netbeans для с++ разработки?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Да, это баг в CLion, т.к. эта IDE еще сырая и пользоваться ей нормально можно будет через пару-тройку лет, судя по тому что за год они этот баг так и не поправили.
    Под Linux советую использовать QtCreator.
    Ответ написан
    6 комментариев
  • Почему не советуют использовать технологии Borland?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Всё очень просто: не нужно. Откройте любой сайт с вакансиями, например hh.ru и посмотрите каков процент вакансий со знаниями стека технологий Embarcadero. Хорошо если одна вакансия найдётся.
    Ответ написан
  • Стоит ли вообще изучать C++?

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

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

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Стоп.

    Итерироваться по вектору и удалить/добавлять элементы -- плохая идея. Вектор вполне себе может реалоцироваться и всё печально закончится. Т.е. валидность итераторов не гарантируется после удаления/вставки. Можно поизвращаться конечно, но это костыльно. Либо делайте копию вектора и добавляейте/удаляйте элементы, либо выберите другой контейнер, думаю что list подойдёт или forward_list, а то и мапа какая-нибудь. Ктож знает какая у вас задача. В любом случае, я уверен что это не что-то высоконагруженное и быстрое, т.ч. преимущества вектора для последовательного перебора в виде кеш-линии вам ничего не даст.

    Вот это мне не слишком понятно:
    (*obj)->eat();
    У вас какой-то свой хитрый итератор? Или странная логика -- кто кого съел: объект сам себя что ли? Я бы еще что-то вроде этого понял:
    (*obj)->eat(*obj1);
    В любом случае, советую продумать архитектуру и обратить внимания на паттерны проектирования вроде наблюдателя и посредника.

    PS
    И вопрос слегка не коректен, похоже что вы боретесь со следствиями какой-то архитектурной ошибки. Т.е. фактически вам нет необходимости удалять элементы из вектора при итерировании. По факту надо спросить как-то так: я решаю такую-то проблему, придумал её решить так-то, но вот незадача... как лучше сделать?
    Ответ написан
  • Как установить иконку на qpushbutton?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вам нужно проверить (в следующем порядке):
    1) Действительно ли активируется слот, если нет, то вызвать qmake.
    2) Попробовать полный путь до иконки, если сработает, то файл у вас лежит не рядом с исполняемым файлом и его нужно переложить.

    А глобально, откройте для себя файлы *.ui (просто создайте проект Qt Widgets Application) и файлы ресурсов. В вашем примере я не вижу ничего такого чтобы потребовало писать код руками а не накидать GUI в визуальном редакторе.
    Ответ написан
    Комментировать