• Как вернуть несколько значений из функции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Кроме параметров функции, можно возвращать структуру с именованными значениями или std::vector или std::touple.
    Ответ написан
    6 комментариев
  • Как пару в очередь добавить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    q.push(make_pair(x,y));
    // или эффективнее.
    q.emplace(x,y);
    Ответ написан
    3 комментария
  • Почему при выводе массива в консоль пишется что-то странное?

    GavriKos
    @GavriKos
    Правильный вывод УКАЗАТЕЛЯ на начало памяти где массив содержится. А массив вы так просто не выведете
    Ответ написан
    Комментировать
  • Почему при выводе массива в консоль пишется что-то странное?

    Nipheris
    @Nipheris Куратор тега C++
    Array-to-pointer decay.
    There is an implicit conversion from lvalues and rvalues of array type to rvalues of pointer type: it constructs a pointer to the first element of an array. This conversion is used whenever arrays appear in context where arrays are not expected, but pointers are:
    ...

    Ваш массив неявно сконвертился к указателю на int, т.к. оператор << класса std::ostream массивы выводить не умеет, а вот указатели - вполне себе.
    Ответ написан
    Комментировать
  • В чем преимущество статического массива перед динамическим?

    Vindicar
    @Vindicar
    RTFM!
    Насколько мне известно...
    Статический массив:
    - Размер должен быть известен на момент компиляции. Твой пример - это нестандартная фишка ряда компиляторов, по-хорошему для статического массива размер не должен быть динамическим (определяться во время выполнения).
    + Компилятор сам позаботится об удалении массива.

    Динамический массив:
    + Размер может определяться во время выполнения.
    - Нужно не забыть освободить память массива самостоятельно.

    А вообще, если нет причин делать иначе, используй std::vector. Если тебе понадобится именно массив в стиле C, вектор позволяет его легко получить методом .data().
    + Размер не просто динамический, вектор может переаллоцировать свою память по мере надобности. Так что для ситуаций, когда размер заведомо неизвестен, вектор весьма удобен.
    + Вектор сам управляет своей памятью. Убил вектор - убил управляемый им массив.
    Ответ написан
    1 комментарий
  • Как учить C++ если будешь знать С?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Знающему C учить C++ так же, как незнающему C. Это разные языки.
    Ответ написан
    Комментировать
  • Что надо изменить в коде чтобы найти количество максимальных элементов массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Разбейте задачу на подзадачи.
    1. Найти максимальный элемент.
    2. Найти количество элементов, равных значению из пункта 1.
    3. Найти позицию последнего элемента равного значению из пункта 1.
    4. Найти сумму квадратов элементов на позициях после найденной в пункте 3.

    Каждый пункт - это один цикл for. Все еще не понятно?
    Ответ написан
    2 комментария
  • Почему не получается установить библиотеку dlib?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    dlib максимум 3.6 Python поддерживает.
    Думаю, правильно будет создать виртуальное окружение (например virtualenv), pycharm это делает особенно удобно; и в нем поставить нужную версию python и остальные нужные библиотеки ставить там же. И там же писать код.

    Также со слов Евгений Шатунов надо убедиться, что
    должна стоять нагрузка на разработку C++ приложений с использованием cmake.
    - как я понял, как раз об этом писали в большом транспаранте в traceback.
    Ответ написан
    3 комментария
  • Почему не получается передать указатель на вектор в класс?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    void Field(vector <Circle> &circles, vector <Rectangle> &rects) {


    Это передача по ссылке а не через указатель. Сюда надо передавать сам circleArray.

    Но сразу скажу, препод такой подход не примет. Вся идея полиморфизма, наследования и виртальных методов в том, чтобы хранить везде указатели на Figure. А то, что какие-то из них на самом деле Circle, а какие-то Rectangle, это уже детали реализации. Виртуальные методы должны переопределятся в потомках и именно там должна быть логика, специфичная для разных фигур.

    Например, у фигур может быть метод "выведи себя". Тогда в коде работы с фигурами вы просто вызываете этот метод у васех фигур даже не зная, круг это или прямоугольник. А вот перегруженный вертуальный метод уже будет выводить конкретную фигуру.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что код функций из шаблонов генерируется по мере надобности.
    Вот встретил компилятор где-то Test<int> - и начинает создавать функцию для int.
    Но в единице трансляции с Functions.cpp он этого не встретил и ничего не генерирует. А когда он компилирует Source.cpp он может только сгенерировать декларацию, но не определение функции. Ведь он видит хедер, но не что написано в Functions.cpp.

    Поэтому, если весь шаблон определять в .h файле то компилятор сможет сгенерировать что ему надо всегда.

    Второй варинат решения проблемы - в Functions.cpp указать компилятору, что шаблон будет использоватся с такиим-то типами:
    using Test<int>;

    Этот подход лучше тем, что один и тот же код не компилируется кучу раз, как если бы он был в хедере.
    С другой стороны, вам надо заранее в месте определения шаблона расписать все используемые с ним типы вручную.

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что вы делите меньшее целое число на большее и получаете целый ноль.
    Ответ написан
    Комментировать
  • Как в указатель на базовый класс вложить ссылку на класс наследник?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильно - вот так:
    object = new Kvadrat();

    Теоретически, можно было бы делать как вы пытаетесь:
    object = &kv;

    Но конкретно в вашем коде - это будет UB, потому что kv - это локальная переменная и у нее очень огранниченная область видимости - внутри if. И вот за пределеами этого if, где вы и попытаетесь, очевидно, использовать указатель object, эта локальная переменная будет уже уничтожена. У вас будет т.н. висячий указатель - указывающий туда, где данные были, а сейчас там может быть все, что угодно.

    Поэтому, если вы присваиваете указателю адрес какого-то объекта (&) вам надо убедиться, что время его жизни не меньше, чем у указателя, пока вы будете его использовать. Можно, например, сделать переменную глобальной, но это очень плохой код. Лучше завести все 4 разных класса в начале функции, потом прочитать нужный и взять указатель на него. Этот подход иногда даже используется на практике.

    Но лучше, все-таки, не плодить лишних сущностей и создавать объект сразу в куче с помощью new. Тогда он сам нигде не уничтожится.
    Ответ написан
    1 комментарий
  • Как создать новый поток внутри метода класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В документации есть пример:
    std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f


    У вас надо cделать: std::thread t5(&A::Zoom, this);
    Ответ написан
    Комментировать
  • Можно ли найти работу gml(GameMaker)-разработчику игр?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    1. Найти работу до достижения 18-и лет почти нереально.
    2. Найти первую работу разработчиком очень тяжело.
    3. Найти работу в геймдеве, не имея опыта разработчика, почти нереально.
    4. Найти работу с GameMaker почти нереально.

    В вашем случае наложение всех этих факторов многократно умножает сложность задачи.
    Ответ написан
    Комментировать
  • Почему выводится другое значение вместо ожидаемого?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Очевидно, потому что оператор value++ (вместе с square) выполнился раньше оператора сдвига <<, которые используются для вывода в поток cout.

    Вообще, у меня оно выводит 13.

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

    Вообще, использование переменной value в том же выражении, что и она же с постинкриментом - Undefined behavior.

    Мне лень искать конкретные пункты стандарта, из которых будет следовать, что это UB, но просто запомните: нельзя использовать перменную и переменную++ в одном и том же выражении.
    Ответ написан
    3 комментария
  • Почему выводится другое значение вместо ожидаемого?

    HighTechLowLife
    @HighTechLowLife
    https://en.cppreference.com/w/cpp/language/eval_order

    2) If a side effect on a memory location is unsequenced relative to a value computation using the value of any object in the same memory location, the behavior is undefined.

    cout << i << i++; // undefined behavior until C++17
    a[i] = i++;       // undefined behavior until C++17
    n = ++i + i;      // undefined behavior
    Ответ написан
    Комментировать
  • Как использовать getline с файлом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл через ifstream (или wifstream).
    Вот эту вот штуку и передавайте вместо wcin.
    Ответ написан
    Комментировать
  • Что возвращает return в С++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    В данном конкретном случае, сработает оптимизация RVO - лишних копирований не произойдет.
    Ответ написан
    Комментировать
  • Что возвращает return в С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от кода функции и опций компилятора.

    Советую всем программистам на C++ хотябы почитать про ассемблер.
    Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.

    Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.

    Но есть такая оптимизация, как RVO. В стандарте даже прописано, когда конкретно она гарантирована. Тогда копии не происходит. При этом компилятор вообще не создает локальной переменной. А вместо этого сразу же работает с тем местом, куда надо будет возвращать значение.

    Если код и включенные оптимизации позволяют это сделать - то копии не будет. Но в общем случае - будет копия.
    Ответ написан
    Комментировать