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

    dnovikoff
    @dnovikoff
    float(informatics+algorithmization+algorithm)/3;

    В вашем примере сначала вычисляется int (округляется), а потом переводится в float.
    Нужно перед делением перевести сумму в float
    Ответ написан
    1 комментарий
  • Почему не работает оператор сравнения?

    dnovikoff
    @dnovikoff
    У вас не инициализируется члены класса в конструкторе. Нужно

    Points:Points():x(0), y(0) {
    }

    Points:Points(int x, int y):x(x), y(y) {
    }
    Ответ написан
    1 комментарий
  • В чем разница между [тип] const * и const [тип] const *?

    dnovikoff
    @dnovikoff
    Очень странный пример.
    Между const [type] и [type] const вообще нет никакой разницы - оба раза const применяется к типу
    const [type] const - это двойное применение const к типу, что вызовет ошибку компиляции.

    В случае если const стоит после звездочки, то оператор const применяется к указателю
    То есть [type] * const

    Так же возможны равнозанчные варианты
    [type] const * const
    и
    const [type] * const
    где const применен и к типу и к указателю

    Говоря простыми словами:
    1. Если const относится к типу (до звездочки), то данные по указателю менять нельзя
    2. Если const относится к указателю (после звездочки), то нельзя менять менять сам указатель
    Ответ написан
    Комментировать
  • Можно ли заменить if в данном случае?

    dnovikoff
    @dnovikoff
    Тернарный оператор может быть применен, если выражения имеют одинаковый результирующий тип.

    Я не вижу какого типа у вас z, но предположу, что не const char*
    В случае, если это const char*, то условие как минимум странное.

    Для данного примера тернарный оператор применен быть не может.

    Для такого примера его применить можно:
    cout << (z < 0 ? "Error" : "Ok") << endl;
    Не забывайте, что оператор << имеет больший приоритет, чем оператор меньше

    Update:
    Коллега в предидущем ответе предложил достаточно оригинальный способ
    ((z<0)?(std::cout << "Error"):(std::cout << z)) << std::endl;

    Работать это будет, т.к. у обоих выражений будет одинаковый результирующий тип - std::ostream
    Ответ написан
    Комментировать
  • Не удаляет int в векторе через итератор, как исправить?

    dnovikoff
    @dnovikoff
    Ну прежде всего erase возвращает итератор на елемент, следующий за удаленным
    it = hmn->friends.erase(it);
    Вариант с --it не валиден.

    Во вторых лаконичнее будет воспользоваться erase-remove идиомой https://en.wikipedia.org/wiki/Erase–remove_idiom
    там есть пример на ваш случай
    Ответ написан
    2 комментария
  • Множственное наследование?

    dnovikoff
    @dnovikoff
    Ответ - оба метода.
    Обращаться к ним можно будет как Base1::foo() и Base2::foo()

    При обращении возникнет ошибка неоднозначности выбора метода, если не указать явно класс.

    П.С.
    ; ставится после определения класса, а после определения метода ее ставить не нужно.
    Ответ написан
    Комментировать
  • Каков необходимый минимум знаний для junior'а/стажера (с++) и где найти работу студенту?

    dnovikoff
    @dnovikoff
    Давайте рассуждать логически. Вы студент без опыта работы. Работодатель это знает. Что он может с вас потребовать в качестве знаний? Базовое знание языка, понимание алгоритмов в рамках учебной программы и знание рахных технических дисциплин в рамках курса. Вот и получается, что единственное, чем вы можете заинтересовать работодателя "оставляет желать лучшего". Вы могли бы попробывать заинтересовать работодателя тем, что вы "быстро учитесь", но судя по оценкам и это не так. Так что мой вам совет - проявите усердие в учебе. Если вы хотите стать качественным программистом, то пробелы в математике и других технических дисциплинах все-равно придется зачищать. Но после универа это придется делать в свое свободное время.

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

    dnovikoff
    @dnovikoff
    В чем разрабатывать - это дело десятое и даже двадацатое. На первом месте знание языка, технологий, наличие опыта в разработке. Если вы все это хорошо знаете, то работодатель не будет вам отказывать из-за того, что вы MS VS не знаете. Надо будет - научитесь - дело наживное. Конечно им бы хотелось, чтобы вы знали как работать с принятыми на их проекте инструментами, но если выбор будет стоят между тем, кто не знает нормально языка, но умеет работать с Visual Studio и тем кто знает язык, то поверьте, выбор будет сделан однозначно в пользу последнего. Конечно работодатели пишут много разных "хотелок", но практика показывает, что среди этих хотелок очень много того, на что они легко готовы забить.
    Ответ написан
    Комментировать
  • Как передать аргумент в поток C++ Thread?

    dnovikoff
    @dnovikoff
    Тред можно создать и так

    std::thread([] {
    // your code here
    });

    И даже так

    std::thread([param] { // захват по значению
    foo(param);
    });
    Ответ написан
    Комментировать
  • Многопоточность в C++ vs C# для сети. Что лучше?

    dnovikoff
    @dnovikoff
    Для приложения на С++ с boost::asio 500+ соединений - это вообще ни о чем. Выдержит намного больше.
    Для любителей можно навернуть и на libev/libuv. Но асио хватит.
    Ответ написан
    Комментировать
  • Какие есть методы оптимизации размера программы (исполняемого кода)?

    dnovikoff
    @dnovikoff
    Дополню коллег. Если речь идет про C/C++(судя по тегам так). Смотрите на опции вашего компилятора. Приведу аналогии: компилятор gcc/clang, использует ключ компиляции -Os (s от слова size. То есть оптимизация по размеру). Для студии это будет /O1.

    Есть вещи которые сильно "раздувают" код. Например использование шаблонов может сильно увеличить размер вашего бинарника, т.к. каждая инстанциация шаблона - это новый класс.
    Ответ написан
    3 комментария
  • Как правильно запутить конструктор родителя внутри наследника?

    dnovikoff
    @dnovikoff
    Вы получаете ошибку этапа компоновки (linking), а не ошибку этапа компиляции (compile).

    Смысл ошибки в том, что отсутсвует определение конструктора для класса Node<ros_johnny5::servoMsgArray, ros_johnny5::robotState> (да - именно так. с кнонкретными параметрами). Его нет в заголовочном файле и он не прилинкован из другого объектного файла/библиотеки.

    Принято для шаблонов совмещать объявление и опредление функций. То есть в том месте, где у вас есть объявление, должно быть и тело конструктора.

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

    dnovikoff
    @dnovikoff
    Кавычки поменять с двойных на одинарные. "e" - это массив из двух элементов: символ "е" и терминирующий нуль. В то время как 'e' (в одинарных кавычках) - это символ.
    Ответ написан
    1 комментарий