• Как работает определение дружественной функции внутри класса?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Перегрузка большинства операторов может быть произведена любым из двух способов: внешней функцией или методом класса. Лишь некоторые операторы невозможно перегрузить в виде внешней функции, их перегрузка осуществляется только в виде метода класса.
    Иными словами, все операторы можно перегрузить в виде метода и только некоторые - в виде внешней функции.
    Разница между перегрузкой в виде внешней функции и перегрузкой в виде метода состоит в том, что метод является частью интерфейса класса и имеет доступ к его непубличным объявлениям, а внешняя функция частью интерфейса не является и доступ имеет только к публичным объявлениям класса.

    Дружественность к перегрузке операторов не имеет никакого отношения. Перегрузка оператора в виде внешней функции и добавление дружественности для этой перегрузки выглядит как признак незнания стандарта в плане перегрузки операторов. Потому что в этом случае перегрузку нужно проводить в виде метода.
    Исключением являться может только определение перегрузки оператора по месту объявления дружественности. Я уже объяснял почему это может быть удобно.
    Такая перегрузка становится только ADL-доступной и не может быть вызвана через полную квалификацию имени.

    Как я понимаю, эта техника позволяет писать перегрузку оператора внутри класса, как будто это член класса, а не глобальная бинарная дружественная функция.

    Это не так. У тебя неверное понимание. Наверное ты уже подзабыл мое прошлое объяснение по этому вопросу. Я рекомендую повторно обратиться к тому вопросу и ответу.
    friend std::ostream& operator<<(std::ostream& os, const Object & r) {/**/ return os;}

    Тут operator << все так же остается глобальной функцией, определенной в том же пространстве имен, где определен и тип Object, но не в пространстве имен типа Object. Но, будучи определенным по месту объявления дружественности, оператор стал только ADL-доступным. Обращение к этому оператору может быть найдено только тогда, когда в конструкции std::cout << obj; этот obj имеет тип Object.

    Но почему такая же логика не работает с обычной функцией?

    Минимально, потому что операторы никак нельзя сравнивать ни с глобальными функциями, ни с методами. У операторов своя отдельная методика вызова, отличная от функций.
    friend void fOUT (void) { }, опять же, является определением по месту объявления дружественности и доступна только через ADL. Но у нее нет аргументов чтобы ADL смог найти ее при обращении. Поэтому такая конструкция является бесполезной.
    Ответ написан
    Комментировать
  • Зачем нужен отдельный синтаксис для препроцессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем нужен отдельный синтаксис для препроцессора

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

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    На gamedev.ru есть статьи по вулкану. В частности, там есть демонстрация самого минимального примера.
    На хабре есть много статей по вулкану. Среди них есть и уроки от самого начала работы, и некоторые минимальные примеры.
    У GLFW есть свои собственные материалы по работе с вулканом. А на их гитхабе есть прямо готовый пример для треугольника.
    Ответ написан
    5 комментариев
  • Как записать массив пикселей в изображение?

    15432
    @15432
    Системный программист ^_^
    Возможно, если в привычном вам формате, то следует использовать библиотеки для работы с PNG или хотя бы BMP. Создайте класс PNG картинки с нужными шириной и высотой, а затем в цикле назначьте каждому пикселю нужный цвет, после чего вызовите метод сохранения в файл.
    Конкретные имена методов будут различаться в зависимости от выбранной библиотеки для работы с изображением.
    Ответ написан
    Комментировать
  • Как отправить готовую написанную игру на другой компьютер?

    Nipheris
    @Nipheris Куратор тега C++
    Всё как и должно быть. Потому что не всегда C++ приложение можно просто так запустить на другой машине.
    На тулчейне от Microsoft (очевидно, вы используете Visual Studio для разработки, т.к. недостающие библиотеки из текста ваших ошибок - это студийный C++ рантайм) при использовании динамической линковки рантайма нужно приложить некоторые дополнительные усилия, чтобы этот рантайм появился на другой машине (т.к. его там ещё может не быть - ведь рантайм для каждой мажорной версии студийного компилятора свой). Вы можете как установить рантайм централизованно, так и положить его рядом с вашим приложением. Ну или вы можете слинковать рантайм статически.

    Задача, которую вам сейчас нужно решить, называется развёртыванием (deployment). Это абсолютно нормально, что вы столкнулись с необходимостью разобраться с этим, раз вы пользуетесь C++.

    Нет лучшего источника информации по этой задаче в рамках тулчейна Visual C++, чем вот эта страница: en/ru. Разбирайтесь, и у вас точно всё получится - абсолютно в каждом C++ проекте production-уровня эта задача решается тем или иным способом. Возможно вам потребуется дополнительно разобраться, что это вообще такое за "рантайм" и почему он требуется для работы вашего приложения.
    Ответ написан
    1 комментарий
  • Как писать код С++ на Линукс?

    @rPman
    Настоятельно рекомендую начать изучение c++ с командной строки (буквально hello world писать в текстовом редакторе и собирать, запуская вручную gcc/clang), т.е. тулчейна, затем системы сборки, make, cmake, scons (кстати это питоновские скрипты, описывающие проект) и вот после того как пощупаешь, соберешь чужие проекты, и вот тогда загляни в красивые GUI (idea/qtcreator/eclipse/...)
    Ответ написан
    Комментировать
  • Что не так с кодом,почему пишет ошибка?

    @WAR_VIK
    Вот так можно решить Вашу задачу:
    #include <iostream>
    #include <ctime>
    
    void fillRandom(int* arr, int size, int min, int max) {
        for(int i{0}; i < size; ++i) {
              arr[i] = min + (rand() % ((max - min) + 1));
        }
    }
    
    int main() {
          srand(time(NULL));
          int len{10}, min{10}, max{99};
          int array[len];
          fillRandom(array, len, min, max);
          for(int& i : array) std::cout << i <<' ';
          return 0;
    }

    Можно и по модному - через лямбду:
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    
    void fill_random(std::vector& v, int min, int max) {
           int i{0};
           auto lambda = [&](int index){ v[i] = min + (rand() % ((max - min) + 1)); ++i; };
           std::for_each(v.begin(), v.end(), lambda);
    }
    
    int main() {
           srand(time(NULL));
           int size{10}, min{10}, max{99};
           std::vector<int> vec(size);
           fill_random(vec, min, max);
           for(int& i : vec) std::cout << i << ' ';
           return 0;
    }
    Ответ написан
    2 комментария
  • Принёсет ли дивиденды изучение модулей С++20?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Знание определенной особенности синтаксиса языка не является основным критерием приема на работу на должность разработчика на C++, потому что оно приобретается за один (1) вечер - путем изучения учебника и реализации пары примеров из него же.
    Ответ написан
    Комментировать
  • Будет ли скомпилированный код C++ работать на всех архитектурах процессора?

    @res2001
    Developer, ex-admin
    Даже бинарник для х64 не будет работать под х32, что уж говорить о принципиально разных архитектурах.
    В исполняемом файле содержатся машинные команды для конкретной архитектуры процессора.
    Для другой архитектуры нужен другой исполняемый файл.
    То же самое актуально и для разных ОС (бинарники для линукс и винды не совместимы). Но, обычно, есть варианты запустить бинарник от другой ОС - виртуализация, wine в линукс, WSL в винде.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вас не смущает, что в одном числе точка - а в другом запятая?
    Ответ написан
    Комментировать
  • Что такое #define LIN 37?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать
  • Проблема с получением времени c++?

    @rPman
    а ты делаешь этот код в цикле с интервалом хотя бы минута?
    совет, равенство делай не строгое, а такое st.wMinute >=21
    и отладка, хотя бы выводи на экран на время поиска проблемы значение st.wMinute
    Ответ написан
    Комментировать
  • Проверить первые 2 байта?

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

    Или используйте fread. Читайте 2 байта в буфер длинной 2.
    Ответ написан
    Комментировать
  • Из за чего появляется ошибка ошибка ld returned 1 exit status?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Выше написанно undefined reference to 'processingArray(int*, int)'


    Ну вот. У вас функция processingArray объявлена, но нигде не реализована. Тело функции где? Поскольку вы ее объявили, компилятор это безобразие проглатил и понадеялся, что эта функция реализована в другом файле и на этапе линковки она найдется. Но линкер ее не нашел, потому что ее нигде и нет.

    Вы, видимо, не все из учебника переписали. Там после функции main скорее всего идет реализация функции processingArray.
    Ответ написан
    7 комментариев
  • Как сделать программу, которая выводит текст из фала в чат в браузере?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Параметр функции int arr[],

    Но далее у вас arr[i][j]. Компилятор пытается взять индекс j, но перед ним же уже число. Вот он вам и говорит "начальника, индекс я у массива (указателя) взять могу, а тут число, непонятно".

    Вы обращаетесь с одномерным массивом, как будто бы он двумерный.
    Ответ написан
    Комментировать
  • Что значит эта строка на СИ/C++?

    Нет, это и есть полная запись - переменная с именем func, которая хранит указатель на функцию, которая принимает double и возвращает double.
    Читать по спирали: https://habr.com/ru/post/100104/

    Если есть возможность, лучше использовать std::function - это читабельнее
    https://en.cppreference.com/w/cpp/utility/function...
    Ответ написан
    2 комментария
  • Какая книга по С++ мне лучше подойдёт?

    @res2001
    Developer, ex-admin
    Вам нужна книга, которую прочитаешь и сразу в "сеньоры" можно идти?
    Боюсь такой нет. Только практика и еще раз практика.

    Из продвинутых книг могу посоветовать:
    1. Эффективный и современный С++. 42 рекомендации по использованию C11 и C14
    в ней очень толково описаны нововведения в стандартах уже не совсем свежих, но эти нововведения чуть ли не самое главное изменение в языке до сих пор.
    2. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
    3. Оптимизация программ на C++. Проверенные методы повышения производительности.
    Ответ написан
    2 комментария
  • Почему вместо элементов динамического массива выводиться мусор, а некоторые элементы вообще не выводяться?

    Ocelot
    @Ocelot
    Когда вы заполняете массивы, переменные, задающие их размеры, идут в порядке k, m, n; а когда выводите - m, n, k. Придумывайте осмысленные имена вместо ничего не значащих букв, так меньше вероятность ошибиться.
    Ответ написан
    Комментировать
  • Как соеденить массив строк в одну строку и разделить пробелами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если это С++ и вы используете std::string, то можно строки тупо суммировать через +=.

    Если по условию задания вам надо делать все руками, то нужно выделить память, чтобы все поместилось, а дальше можно воспользоваться strcat_s, memcpy или вообще посимвольно копировать.
    Ответ написан
    Комментировать