Задать вопрос
  • Как правильно перегрузить конструкторы в классе?

    @majstar_Zubr
    C++, C#, gamedev
    Рассмотрим проблему подробнее.

    class A {
    private:
     int aa;
     int ab;
    
    public:
     A()
         : aa(0), ab(0) {}  // (4) note: candidate constructor not viable: requires
                            // 0 arguments, but 1 was provided
     A(int a)
         : aa(a), ab(0) {}  // (2) note: candidate constructor not viable: no known
                            // conversion from 'A' to 'int' for 1st argument
     A(A& obj);  // (3) note: andidate constructor not viable: expects an l-value
                 // for 1st argument
     void Show() { cout << "Var1: " << aa << endl << "Var2: " << ab << endl; }
    };
    
    int main() {
     A obj = 5;  // (1) error: cannot bind non-const lvalue reference of type ‘A&’
                 // to an rvalue of type ‘A’
     obj.Show();
    
     return 0;
    }


    Стандарт обязывает понимать

    A(A& obj);

    как user-defined конструктор копирования. Поэтому, конструктор копирования T::T(const T&) не будет объявлен по-умолчанию компилятором. Со стандарта C++11 предоставляется возможность заставить компилятор генерировать неявно-объявленный конструктор копирования ключевым словом default

    A(A& obj) = default;

    Неявно объявленный конструктор копирования по-умолчанию имеет сигнатуру T::T(const T&) но лишь в случае, когда все базовые классы T имеют конструкторы копирования с параметрами const B& или const volatile B&, и когда все не статические данные-члены класса T имеют конструкторы копирования с параметрами const M& или const volatile M&.

    В ином случае, неявно объявленный конструктор копирования имеет сигнатуру

    T::T(T&)

    В данном случае, конструктор копирования A(A& obj) является тривиальным с сигнатурой сгенерированного неявно-определённого конструктора копирования T::T(T&).
    Тривиальное копирование практически аналогично std::memmove

    В строке ошибки компиляции происходит следующее:

    1) оператор = в строке с ошибкой компиляции не является инициализирующим, поскольку литерал 5 является (rvalue, нельзя взять адрес) const int. Для исполнения операции присваивания компилятор сначала конструирует A(5);

    ...
    A(int a) : aa(a), ab(0) {
     cout << "Copy ctor with 1 parameter is called " << endl;
    }
    …
    int main() {
    …


    Вывод:
    Copy ctor with 1 parameter is called
    Var1: 5
    Var2: 0


    2) операция присваивания имеет дело с A obj = A (5):

    Справа от оператора присваивания находится временный rvalue типа class A.
    Данное присваивание является инициализирующим, что делает его эквивалентным A obj(A(5));
    Для данной операции необходим конструктор с сигнатурой T::T(T&&)
    Это - конструктор перемещения, и он в классе A отсутствует, поскольку неявное определение конструктора перемещения в классе требует отсутствия user-defined конструкторов копирования, оператора = копирования, оператора = присваивания, деструктора. В нашем случае, у нас имеется user-defined A(A& obj);

    Учитывая вышесказанное, для исправления ошибки компиляции можно либо удалить строку
    A(A& obj); ,
    что приведёт к неявному определению компилятором тривиальных конструкторов копирования и перемещения, либо добавить ещё в объявление класса A строку
    A(A&& obj);

    С точки зрения стандарта С++11 и выше, можно утверждать, что выражения A(A& obj); и A(A&& obj); соответственно эквивалентны A(A& obj) = default; и A(A&& obj) = default;
    Ответ написан
    5 комментариев
  • Как проще в VIsual C/C++ заменить "//" на "/" в переданном аргументе командной строки?

    myjcom
    @myjcom Куратор тега C++
    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    
    int main()
    {
      string s = "G:/Dev/MinGW/bin/Patch.exe -p0 -i"
                 " G:/avidemux_2.7.4/avidemux_core/..//avidemux_core/"
                 "ffmpeg_package//patches////////libavcodec_ac3_h.patch ";
          auto end = unique(s.begin(), s.end(), [](unsigned char l, unsigned char r){
              return l == '/' && r == '/';
          });
      s.erase(end, s.end());
      cout << s;
    }


    https://en.cppreference.com/w/cpp/algorithm/unique
    https://en.cppreference.com/w/cpp/algorithm/unique_copy

    в зависимости от степени мутабельности.
    Ответ написан
    Комментировать
  • Как исправить ошибку доступа к памяти?

    myjcom
    @myjcom Куратор тега C++
    SouLWorkeR,
    инициализация идет у функциях выше

    Извини, но ты пишешь немного не про то.
    У тебя используются неиницилизированные переменные
    int number_of_goods; // Вот тут рандомное значение
    int* price_of_goods = new int[number_of_goods]; // ???


    int count_of_days; // Вот тут тоже
    int *works_hours = new int[count_of_days]; // ???


    а здесь, ещё дополнительно

    for (int i = 0; i < sizeof(price_of_goods)/sizeof(int); i++) {
          if (temp == price_of_goods[i]) {
            cout << "Yes, it has this price" << endl;
            z++;
            break;
          }

    вот это
    sizeof(price_of_goods) == sizeof(int*) / sizeof(int)
    Ответ написан
    Комментировать
  • Как инициализировать массив из char stringом?

    myjcom
    @myjcom Куратор тега C++
    string s;
    getline(cin, s);
    
    vector<char> chars(s.begin(), s.end());
    Ответ написан
    Комментировать
  • Как проверять на нестрогое неравенство вещественные числа?

    myjcom
    @myjcom
    Classification and comparison
    https://en.cppreference.com/w/c/numeric/math
    Ответ написан
    Комментировать
  • Как на 2D картинке объяснить объекту 3D пространство?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Ваша картинка должна быть дополнена картой глубины. Ее можно представить в виде одноканальной картинки, "чем темнее, тем глубже в этой точке пространство", либо в виде набора боксов, ограничивающих препятствия.

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

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    Специальность должна начинаться со слов senior. Окончание фразы не так важно.
    Учи английский. Не школьную или институтскую программу, а на уровне свободного владения языком.
    Ответ написан
    Комментировать
  • Насколько важен атестат об окончании школы для трудоустройства в сфере GameDev?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Никогда ещё эта картинка не была так кстати!
    5e3e4974025c8931853294.jpeg
    Геймдев совсем не такой, каким вы его себе представляете.
    Ответ написан
    Комментировать
  • Бывают ли "умные" проходные/перекрестные выключатели?

    deepblack
    @deepblack
    Я использовал твердотельные реле (на фото слева), и продублировал их в параллель (по каналу управления) обычными выключателями.
    Диммер (на фото справа) работает по протоколу I2C, его так просто не обойти (если хотим сохранить функционал).
    5e46281cb5adf840991605.jpeg
    Управляет всем этим Banana Pro (через GPIO) с самописным frontend на React'е

    Сейчас я бы использовал вместо твердотельных реле - импульные реле (как уже посоветовал golovopatolog)
    Ответ написан
    4 комментария
  • Бывают ли "умные" проходные/перекрестные выключатели?

    @golovopatolog
    Используйте импульсные реле, которые в свою очередь сконцентрируйте в одном щите. В этом случае можно сделать любые сценарии или менять их без переделки проводки
    Ответ написан
    Комментировать
  • Почему "идентификатор не определён"?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Вытащи p, p1, p2 наружу из if. Читай «область видимости».

    2. Я бы сделал так…
    Work* p = NULL;
    if () {
      p = new Work();
    }
    delete p;

    Работает, потому что NULL можно спокойно уничтожать, и ничего не будет.

    На Си++11 можно также использовать умные указатели.
    std::unique_ptr<Work> p;
    if () {
      p = std::make_unique<Work>();  // простите, это Си++14, на 11 чуть не так.
    }
    Ответ написан
    Комментировать
  • На чём сделать GUI?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    PyQt + Qt Designer.
    Ответ написан
    Комментировать
  • Как написать функцию дешифровки методом Вернама?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Так как шифр тов. Вернама - симметричный, дешифровку вы уже написали.

    Поясню - в симметричной криптосистеме, для шифрования складывают гамму (в случае ш. Вернама - ключ из блокнота) по модулю, равному мощности алфавита, с шифруемым текстом.

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

    myjcom
    @myjcom Куратор тега C++
    И это вприницпи работает. Как мне сделать так, что бы у каждого предмета можно было выставлять определённый коофицент выпадения? Или хотя бы подскажите куда копать, в каком направлении.

    Смотри:
    В урну поместили 2 шара: черный и белый, какова вероятность того, что первый наугад вынутый шар окажется белым?

    Дальше

    В урну поместили три шара: белый, черный и красный, какова вероятность того, что первый наугад вынутый шар окажется белым?

    Дальше
    В урну поместили четыре шара: 2 белых, черный и красный, какова вероятность того, что первый наугад вынутый шар окажется белым?

    Учитывай что полная вероятность равна 1.0

    Вот так это работает, а все остальное вздор... .

    Другими словами тебе нужно N штук каждого элемента пропорционально твоему коэфиценту выпадения. Потом https://en.cppreference.com/w/cpp/algorithm/random...

    А дальше рандомно дёргать из контейнера, оставлять их там или удалять зависит от задачи.

    Использовать распределения или нет аналогично. https://en.cppreference.com/w/cpp/numeric/random

    Более сложные варианты я описывать не возьмусь.
    Ответ написан
    Комментировать
  • Как изучать С# после С++, и стоит ли вообще?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы просто изучаете Си с диезом, и всё, что узнаёте по этому языку, прикладываете к вашим знаниям Си с крестами.

    > С++, С# или все вместе?
    По минимуму желательно освоить оба языка, а вот рисунок кода, инструментарий и прочее — по Си# подтянуть хвосты будет как-то проще.

    > Если С# то учить с нуля?
    Вы уже не ноль, и курс, где вас будут просить решить квадратное уравнение в консоли, может поначалу для вас оказаться тратой времени. Но это уже зависит от ваших знаний — видимо, у вас их не так много и потери будут невелики.

    > Если С++, то что учить дальше кроме ООП?
    Строить живые проекты. Qt (хоть в простейшем виде). SDL (хоть в простейшем виде, раз уж вы геймдевщик). Какой-нибудь игровой движок (Unreal или Godot), но это уже серьёзно.

    > Есть ли что-то что повысит мои шансы попасть в геймдев?
    Трёхмерная математика. Кватернион единичной длины как замена матрице поворота в 3D. Обработка изображений и звука, хоть простейшая. «Programmer’s art» вроде шейдеров и систем частиц. Умение программировать трёхмерные игры на готовом движке хоть в простейшем варианте. Умение написать своими силами (на тонкой обёртке вроде SDL) хотя бы «Элиту».
    Ответ написан
    Комментировать
  • Какой цвет принимает небо в зависимости от состава атмосферы?

    Moskus
    @Moskus
    Хороший пример вопроса из области науки, который иллюстрирует, что "нагуглить" ответ, не зная фундаментальных механизмов явления - крайне сложно.
    Если принять, что спектр светила более-менее равномерно покрывает весь видимый диапазон, то цвет неба с поверхности планеты определяется несколькими факторами:
    - насыщенность цвета определяется толщиной атмосферы, потому что без атмосферы небо будет чёрным, а собственно оттенок появляется пропорционально толщине;
    - спектр поглощения и рассеяния газообразных веществ (нужно понимать, что, например, молекулы воды в атмосфере - тоже "газ"), входящих в состав атмосферы;
    - наличие в атмосфере аэрозолей, размер их частиц, их спектры поглощения и рассеяния;
    - эффекты вроде рэлеевского рассеяния (см. Диффузное излучение неба).
    Скажем, если в земную атмосферу добавить существенное количество хлора, в цвете неба появится большая относительная доля желтого, благодаря тому, как молекулы хлора рассеивают желтый. А газообразный йод или диоксид азота в существенной концентрации увеличат долю красного и оранжевого. Однако, не ждите столь заметных эффектов от многих других газов - их спектры поглощения и рассеяния не на столько выражены. Наличие окраски, скорее, исключение из правил.
    Ответ написан
    3 комментария
  • Почему не вызывается конструктор копирования?

    hePPer
    @hePPer
    похоже на пропуск конструктора при оптимизации
    Copy elision
    Ответ написан
    4 комментария
  • Какую библиотеку лучше взять для простейшего http сервера на C++?

    myjcom
    @myjcom Куратор тега C++
    На счёт лучше не знаю
    РОСО
    Пример

    Ну или Boost.Asio

    Смотря что нужно.
    Ответ написан
    Комментировать
  • Почему ругается Visual Studio c++?

    @res2001
    Developer, ex-admin
    Это не странно - разные компиляторы ведут себя по разному. К тому же степень ругани компилятора очень сильно зависит от параметров компиляции.

    Вот что по поводу этой ошибки пишут в микрософте.
    Описание то же не особо помогает.
    Попробуй сделать n статической. Или определи как define.
    Ответ написан
    3 комментария