Задать вопрос
  • Большие шаблонные классы( реализуя CRTP). Все пихать в один .h файл?

    @MarkusD Куратор тега C++
    Артур, может быть тогда тебе пригодится и другой мой ответ?
    Вопрос там у человека тоже был довольно интересный.
  • Большие шаблонные классы( реализуя CRTP). Все пихать в один .h файл?

    @MarkusD Куратор тега C++
    Артур, дело в том, что CRTP в общем смысле - это mixin.
    Миксины реализуют некоторую очень узкую функциональность поверх некоторого типа. Именно для этого тип в миксин и передается.
    Миксин как бы подмешивает свою функциональность в общую функциональность внешнего типа.
    Обычно эта функциональность является очень компактной, как, например, идиома иммутабельности или идиома некопируемости.

    Например, таким миксином является моя реализация CBSE - композиция.
    Сам миксин там очень прост, хоть и объемен в тексте, но за ним скрывается целая подсистема управления памятью, которая никак не вписывается в один файл или один шаблон одного типа.

    В целом-то, быть может тебе от динамического полиморфизма перейти стоит именно к вариантам CBSE? Композицию сделать можно и другими способами, попроще. А уж компонентно-ориентированный подход сегодня обсуждается очень широко и представлен большим объемом информации.
    Вопрос в том, что именно ты решил изменить через замену динамического полиморфизма на статический?
  • Большие шаблонные классы( реализуя CRTP). Все пихать в один .h файл?

    @MarkusD Куратор тега C++
    Артур , постой-ка. А почему базовый класс должен быть шаблонным? Прямо таки CRTP этого требует?
    Давай проясним суть CRTP. Что это, что обозначает этот акроним и чем CRTP является в общем понимании не привязываясь к конкретному языку?
  • Стоит ли тратить время на GLSL и OpenGL во времена Unreal Engine 4?

    Роман Денискин,
    Так есть ли смысл рыпаться в геймдев разработку изучая кучу новых компетенций

    Тут как сказать... Вот лично я, исключительно по своему опыту. Для меня на моем первом курсе стало откровением что я смогу работать в геймдеве. В те года, насколько мог, я рыл информацию о том, как создавать игры, но находил только информацию о том, как писать свой движок. И интереснее всего для меня стала именно разработка движка.
    Все определяют твои интересы. Если у тебя мало интересов на твоей текущей работе, если тебя тянет в другую область, то попробовать себя, конечно, стоит.

    5-7 лет - это, в большей степени, специфика C++. Использовать его не так просто, обучаться работе с ним тоже непросто. До сих пор на разных должностях работают люди, которые, в целом-то, пишут на этом языке, но зачастую даже не понимают что именно они пишут. Ты смотришь в этот код и у тебя волосы встают дыбом. :)
    Я работаю не только с плюсами, я активно применяю и питон, и шарп, и некоторые встраиваемые языки. И вот если у меня приключается проблема с питоном или шарпом, я чаще иду сюда или на so. Но если у меня случается проблема с плюсами, я иду читать стандарт и документацию. На других языках и писать проще, и проблемы решаются легче. В этом суть вот этих 5-7 лет. А на работу ты можешь пробовать устраиваться хоть с текущими знаниями, тебе по требованиям к сотруднику все расскажут.

    И в случае если я таки решусь, на какие зп тут и на западе может примерно рассчитывать разработчик С++ со знанием того же UE4 + Vulkan?

    Про з/п придется разговаривать непосредственно с будущим нанимателем. Но что-нибудь между $1.5k и $3k/mth вполне может нарисоваться. В общем смысле ты вполне можешь рассчитывать на все те же $2k/mth на среднем уровне. Но еще готовиться стоит к тому, что у пользователей C++ в целом зарплата немного не соответствует требованиям, она обычно изрядно ниже.

    Как минимум, если тебе захочется именно зайти в геймдев оглянуться, ты можешь попробовать такой план.
    У тебя определенно есть некоторая подушка безопасности. Вбрось в нее еще на три месяца вольной жизни и попробуй устроиться на эти три месяца джуном хоть на тот же UE4. Я тебе гарантирую, когда окажешься в офисе (ну... после всех карантинов, конечно же) рядом с опытными ребятами, у тебя на многое откроются глаза и многие направления попрут как по маслу.
    Три месяца пройдет, там и решай уже что и как. Вернуться к своей текущей работе ты ведь все так же сможешь.

    Кстати... да...
    разработчик С++ со знанием того же UE4 + Vulkan

    Вот такой толковый человек может рассчитывать на многое.
    Это - Graphics Engineer (Graphics Programmer), от которого требуется не просто уверенное знание плюсов и GAPI, а знания физики, математики, алгоритмов, оптимизации по времени и данным для GPU, понимание современных графических конвейеров и много всякого другого интересного. Обычно у этих людей перекос или в программировании, или в точных науках, а в противоположном направлении наблюдается просадка знаний. Так вот, полноценно развитый инженер графики - это крайне ценный специалист.
  • Стоит ли тратить время на GLSL и OpenGL во времена Unreal Engine 4?

    Роман Денискин , внесу небольшое уточнение.
    Тебе стоит разобраться в своих желаниях.
    Если тебе хочется делать игры: взять все-таки стоит Unity, т.к. там минимальный цикл разработки многократно меньше UE4.
    Если тебе хочется пойти в серьезный геймдев и делать именно игры, тогда все верно: стоит брать UE4 и получить хорошую квалификацию в C++.

    Если тебе хочется работать в области разработки игр, но непосредственная разработка тебя интересует мало, тогда UE4 для тебя - это не более чем книга для чтения, а изучать уже нужно архитектуру, алгоритмы, математику, оптимизацию, профилирование, низкоуровневые API самых разных осей и направлений. Нужно знать как эффективно работать с памятью и с разными процессорами, как эффективно использовать GPU, как эффективно и понятно писать технически сложный код.
    И вот тогда, как написал Владимир Коротенко , ты как минимум будешь понимать что под капотом у высокоуровневых инструментов. Лет через 5-7 начнешь понимать, если прямо сейчас приступишь. Это долгая и тяжелая дорога к работе в серьезных компаниях.

    И через эти 5-7 лет OpenGL уже будет не нужен. Он и сейчас уже не больно-то нужен, в виду наличия более эффективного вулкана. И тут снова проблема. Вулкан - это очень сложная система с множеством свобод и большими требованиями к профессионализму пользователя. К нему надо подходить уже со знанием графического конвейера, а на это снова нужно много времени и практики.
  • Почему не загружается шейдер?

    @MarkusD Куратор тега C++
    Sancei Laks , нужен код инициализации OpenGL.
  • Как передать параметры в другую программу, запускаемую из кода C/C++?

    @MarkusD Куратор тега C++
    Павел Матвеев, именно для этого люди и читают документацию. :)
    system выполняет системную команду в окружении текущего процесса. Если окружением является cmd, команда будет выполнена в cmd, если bash - то в bash. Строка команды будет передана в подключенный командный процессор, если таковой подключен. И даже в подсистеме оконных приложений Windows, system позволит тебе запустить другую программу с передачей в нее параметров запуска.

    Вторым важным моментом является то, что ты ничего кардинальным образом не сломаешь если просто попробуешь свои догадки. Эксперименты с библиотечным кодом - это неотъемлемая часть освоения любой библиотеки, на ряду с чтением ее документации и, собственно, трассировкой кода. Изучай через эксперименты, документацию и отладку.

    Вот ты сейчас предположил system("C:/Windows/System32/cmd mkdir directory"), а чего просто не вписал и не попробовал? Можно даже так попробовать: system( "mkdir c:\\my-test-dir" ).
    И как? Работает?
  • Как передать параметры в другую программу, запускаемую из кода C/C++?

    @MarkusD Куратор тега C++
    Павел Матвеев , а что тебе мешает собрать строку полной команды запуска со всеми параметрами и передать ее в функцию system?
  • Массивы структур?

    @MarkusD Куратор тега C++
    Антон Жилин,
    При создании cars стоит указать тип vector, иначе это будет initializer_list, который несколько раз (!) будет копироваться в нормальный контейнер.

    Просто на заметку.
    Да, cars будет иметь тип std::initializer_list<Car>, но его копирование - это не проблема.
    std::initializer_list является легковесной надстройкой над статическим массивом на стеке. Внутренняя реализация этого типа не стандартизирована, но практически всегда его размер не превышает двух регистров процессора.
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Никита Каргин, а как насчет того чтобы отметить ответы как решения?
    С моей точки зрения оба ответа являются исчерпывающими для твоего вопроса.
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Никита Каргин, у тебя остались еще какие-нибудь уточнения или вопросы относительно изложенных ниже ответов?
  • Четные и нечетные элементы в массиве на С++?

    @MarkusD Куратор тега C++
    Mag1str, так я и спрашиваю, что тебе непонятно в сортировке четных и нечетных элементов массива?
    Какие у тебя есть предположения по решению задачи?

    Твой вопрос сейчас целиком попадает под П5.12 регламента работы сервиса. Мои уточняющие вопросы нужды для того чтобы ты мог исправить ситуацию фактического нарушения правил.
  • Четные и нечетные элементы в массиве на С++?

    @MarkusD Куратор тега C++
    Mag1str , так и что же тебе непонятно в решении задачи?
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Антон Жилин, а, абстрактный тип.
    На такой счет, если мы отходим от прямых языковых терминов и начинаем оперировать терминами архитектурными, лучше будет сразу подсказать человеку порождающие шаблоны: фабричный метод и абстрактную фабрику.

    Есть еще одна деталь у тебя в ответе, которая прямо бросается в глаза. Вот смотри.
    world.push_back(std::move(terr));
    Здесь world хранит std::unique_ptr<object>, но std::move(terr) вернет std::unique_ptr<Terrain>&&. Чтобы в push_back передать правильный std::unique_ptr<object>&& будет использован конструктор преобразования (6). Это произойдет без проблем, но вот что потеряется - так это указание, какой именно деструктор нужно вызвать.
    Т.к. у нас в руках уникальная связь, это 100% приведет к утечке ресурсов и практически точно приведет к утечке памяти.

    Тут, в твоем ответе, будет очень важно сказать про обязательность виртуального деструктора для правильной работы в твоем коде.
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Антон Жилин , а можно поподробнее, что такое виртуальный класс? Желательно со ссылкой на стандартную терминологию.
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Никита Каргин, ну вот смотри.
    vector<object> означает вектор инстанций. Там будут храниться обособленные объекты. В частности, в коде vector<object> wld = { terr } ты сказал неявно сузить экземпляр Terrain до экземпляра object и инициализировать вектор копией этого экземпляра.
    Именно по этой причине код у тебя компилироваться не должен. Инициализация списком запрещает сужающее неявное преобразование типа. Код у тебя сейчас или не компилируется, или компилируется компилятором с низкой поддержкой стандарта (что является катастрофой), или в реальном коде ты все-таки пишешь явное сужающее преобразование.

    Если в векторе тебе хочется чтобы через вектор wld ты мог обратиться к объекту terr, в векторе тебе нужно хранить указатели.
    Если ты хочешь чтобы через указатель на object из вектора wld ты мог получить данные о coords, твой тип Terrain должен оперировать полями object, а от дубликатов этих полей в Terrain нужно избавиться.

    А сейчас компилятор обращается к свойству coords класса object.

    Компилятор никуда не обращается. Он просто транслирует в машинные коды то, что ты ему написал. Важным уточнением здесь будет то, что это ты обращаешься не туда, куда хочешь. С опытом это исправится. :)

    Еще одно замечание. Отвыкай от using namespace std;. Это крайне плохая практика, если коротко.
  • Почему размер объекта не совпадает?

    @MarkusD Куратор тега C++
    Никита Каргин, vector<object> wld = { terr };
    Какого поведения ты ожидаешь от этого кода? Опиши буквально во всех деталях свои ожидания.
  • Как в C++ создать процесс с именем Load.txt?

    @MarkusD Куратор тега C++
    Геогрий Кулиш
    процесс с именем Load.txt

    Что ты под этим понимаешь?
  • Перехват команд джойстика и управление при помощи него роботом. Как реализовать?

    mur_steel , а зачем тебе такая толстая прослойка, как ПК, между двумя достаточно дружественными друг другу железками?
    Протокол USB довольно хорошо описан. Геймпад (это не Joy-Stick, это Gamepad) регулярно откликается полным буфером своего состояния, который тоже очень легко принять и разобрать. У геймпадов не больше 16 осей отклонения и не больше 32 битовых кнопок.
    Более того, для дуинок на гитхабе существует масса открытых библиотек работы с геймпадами по USB. Например...