Ответы пользователя по тегу 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 (а возможно и более старших версий) не умеют заходить в тело однострочного цикла без скобок.
    Ответ написан
  • Почему не советуют использовать технологии 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 в визуальном редакторе.
    Ответ написан
    Комментировать
  • Кроссплатформенность c++ -> Qt\c++, c++\CLI?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Я бы вам посоветовал посмотреть программу в оталдчике и понять что не так. Это действительно полезно для обучения. + поймёте что у вас неправильно.
    Ответ написан
    Комментировать
  • Какие суперкниги по c++ вы изучали и получили максимум удовольствия?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    1) Пожалуй все книги Мейерса.
    2) Книги Стефана Дьюхэрста (Common Knowleage, C++ Gotchas).
    3) Nicolai M. Josuttis (The C++ Standard Library, Second Edition (!!!)).
    4) Александреску. Современное проектирование.
    5) Солтер, Клеппер С++ (моя первая книга по C++).

    Книги Брюса Эккеля не читал.
    Ответ написан
    4 комментария
  • Когда использовать указатели на объекты при объявлении в C++?

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

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Где можно посмотреть зарезервированные имена переменных?

    Вот тут: ru.cppreference.com/w/cpp/keyword.

    Но ваш вопрос не про зарезервированные имена и не про зависимости, а про правила поиска имён в C++. Двигайтесь в этом направлении.
    Ответ написан
    5 комментариев
  • Какие есть книги по Visual Studio с примерами на C++?

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

    Немного странный выбор, на мой взгляд. Если разработка только под винду, то спору нет, vs с решарпером неплохая IDE. Что же до GUI... тут по-моему выбора то особо и нет: Qt (я знаю, что есть и альтернативы, но мне они серьезными не кажутся). А если Qt, то Qt Creator однозначно (+ еще и QML поддерживается).
    Ответ написан
    Комментировать
  • Почему функция "cpy" работает со строками?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Возьмите за правило делать все конструкторы с одним аргументом explicit (хорошо, есть случаи, когда это может оказаться неудобным, но новичку совет хороший). В этом случае не будет неявных преобразований и ваш код не скомпилируется пока вы не напишите a.cpy(String("rap")).print().

    И я всё понимаю, но назвать функцию "cpy"... Так и тянет прочитать по-русски. Эту функцию чисто по смыслу надо заменить на оператор присванивания.
    Ответ написан
    Комментировать
  • Что делает инкремент константного итератора?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    А в чем проблема посмотреть как это реализовано в std, например для вектора? Сразу же станет понятно, что итератор не изменяет элемент, но сам может бегать по коллекции.
    Ответ написан
    Комментировать
  • Как избавится от 'unresolved overloaded function type [int]' при работе с формами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Что делать?

    Почитать документацию на функцию addItem и понять, что double она как минимум не принимает. А еще книгу просто по C++ почитать перед тем как браться за Qt.
    Ответ написан
    Комментировать
  • Изучение C++ - рекомендации, мнения, и возможно участие?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    1) Я рекомендую QtCreator, т.к. это быстрая, легко настраиваемая и кроссплатформенная IDE с поддержкой плагинов. Qt и QML из коробки поддерживается.
    VS не крокссплатформенная, да и убогая без решарпера. + у майкросовтовского компилятора порой очень специфичное толкование стандарта. Вообще не разрабатывайте под виндой (только если за это не платят много денег).
    Clion -- сыро, медленно, на Java. Eclipse см. Clion + еще тележку оперативки надо :D
    2) Если только по C++, то: Страуструп для основ, Седжвик для алгоритмов, Майерс, Саттер и Александреску чтобы понимать. Остальное практика + доки.
    3) Выберите проект, вообще любой и пишите потихоньку, изменения публикуйте на гит. Мб вам там хотелось шашки написать, ну так напишите. Или куда-нибудь контрибьютьте. Гуглите, в общем, это не самое сложное занятие.
    4) Не знаю, но вики говорит, что: "Язык программирования Ардуино является стандартным C++ (используется компилятор AVR-GCC) с некоторыми особенностями, облегчающими новичкам написание первой работающей программы."
    5) Устройтесь джуниором, много читайте и спрашивайте. Есть еще вариант стажировок. Это и будет оптимальное решение: много работы, мало свободного времени и мотивация расти.
    6) См. пункт 5. Не думаю, что кто-то вас будет учить бесплатно (платно скорее всего тоже, т.к. з/п нормальные а свободного времени мало), разве что вы в какой-то открытый проект будете контрибьютить.
    7) -
    8) Написал всё что хотел. Советую на пункт 5 обратить внимание. Ну и не забыайте что изучать надо C++11/14.
    Ответ написан
    1 комментарий
  • #define функции которая передаёт переменное число параметров внутри себя в другую функцию?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Завязывали бы вы с дефайнами)

    #define DO(arg1, ...) doImpl(arg1, ##__VA_ARGS__)
    Ответ написан
    3 комментария
  • Как написать сложный define?

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

    Нужно разобраться с промблемой, которая требует такого костыльного решения. И да, это не шаблонные функции.
    Ответ написан