Задать вопрос
  • Что именно делается константным при таком определении типа?

    @MarkusD Куратор тега C++
    Wataru, я не ради спора, но для того чтобы как можно больше людей объяснялись общей и задокументированной терминологией.
    Давай обратимся к документации на ссылки.
    //  r2 += "!";               // error: cannot modify through reference to const
    ...
    const std::string& r2 = s1 + s1; // okay: lvalue reference to const extends lifetime
    ...
    std::cout << "lvalue reference to const overload f(" << x << ")\n";
    ...

    Note that rvalue references and lvalue references to const extend the lifetimes of temporary objects


    По-английски это звучит именно как reference to const.

    Еще давай обратимся к документации на константность.
    For any type T (including incomplete types), other than function type or reference type ...

    Константность применима для любого типа, кроме типа функции и типа ссылки.

    И ниже еще:
    References and pointers to cv-qualified types may be implicitly converted to references and pointers to more cv-qualified types.

    Т.е. это не cv-ссылки, это - ссылки на cv-типы.

    Разница очень большая и отсутствие понимания этой разницы вводит в заблуждение автора вопроса.
  • Что именно делается константным при таком определении типа?

    @MarkusD Куратор тега C++
    Или это ссылка на константный вектор? Константные ссылки в природе бывают? :)
  • Как привести шестнадцатеричное число к hex виду?

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

    @MarkusD Куратор тега C++
    Ben L, Давай коротко опишу суть без ссылок.
    Во время определения типа задается несколько интерфейсов, среди которых есть родительский интерфейс типа, публичный интерфейс, интерфейс наследников типа и приватный интерфейс типа. Интерфейс - это форма обращения, это набор функций, которые могут быть использованы для изменения состояния экземпляра типа.
    Состояний у типа тоже может быть несколько: все те же родительское состояние, публичное состояние, приватное состояние, состояние наследников.
    Терминами C++ это все выражается через определение области доступа. Функции в области protected: формируют интерфейс наследников. Поля в области private: формируют приватное состояние. Соответственно, публичный интерфейс типа определяется через функции в области public:. При этом, даже если в публичном интерфейсе есть константная функция-геттер, которая просто возвращает константную ссылку на приватное поле, то это не доступ к приватному полю. Это именно публичный интерфейс, который строго ограничивает возможности работы с состоянием экземпляра и именно так обеспечивает инвариантность этого состояния.

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

    @MarkusD Куратор тега C++
    Ben L, видимо с термином инварианта ты не знаком.
    Можно добавить getter-ы в interface.

    Еще раз. Минуя публичный интерфейс типа?
    Ты точно понимаешь мои слова? Что такое публичный интерфейс типа?
  • Как правильно выстроить логику кода с соблюдением принципов ООП?

    @MarkusD Куратор тега C++
    lipa44, хорошо, спасибо.
    // Грани кубика
    Plane UpPlane;
    Plane DownPlane;
    Plane LeftPlane;
    Plane RightPlane;
    Plane FrontPlane;
    Plane BackPlane;

    С этим тебе будет тяжело работать. Тебе ведь надо вращать строки на гранях. При этом, крайние строки на гранях приведут к вращению смежной грани. Вот с таким дизайном тебе будет неудобно. Придется писать много лишнего кода.
    Легче обозначить просто 6 граней в массиве, попутно определяя закон их смежности на ребрах.
    Кубик состоит из 6 граней, в каждой из которых N*N ячеек с цветом. Нас интересует только цвет ячейки. Всего цветов тоже 6. Цвета можно обозначить целыми числами от 0 и до 5.

    vector<vector<vector<MiniCube>>> arr;
    Это память решения? Этому тут не место. Представь что в другой ситуации ты просто дал кубик игроку покрутить. Зачем игроку это поле для игры? В кубике должны быть только свойства кубика. Еще в кубике должна быть функциональность от кубика. Снова представь игрока с кубиком, нужно ли ему что-то дополнительное чтобы крутить его? Не нужно ведь. Следовательно, у кубика должен быть интерфейс крашения его строк.

    #include "cubeSolving.h" // алгоритмы решения
    Если мы дадим кубик игроку, то зачем ему еще и информация о его решении? Этому заголовку тут не место.

    #include "rubikCube.h"
    Вот это уже на месте. Когда ты обращаешься к решениям кубика, тебе уже нужна информация о самом кубике и, собственно, сам кубик.

    cubeSolving() = default;
    А для кого решать будем? Сюда стоит передать ссылку на кубик, который и будем решать.
    В итоге у тебя игрок может взять кубик в произвольном состоянии, положить его в cubeSolving и ткнуть решалке решить.
    Решалка должна оперировать на переданном через конструктор кубике. Вращения она должна выполнять используя только публичный интерфейс кубика.

    Для того чтобы логика вращений не загружала класс кубика, ее можно вынести в тулкит - в отдельный тип, который через свой конструктор примет обозначенный выше массив из 6 граней по ссылке и предоставит интерфейс для вращения строк. При этом, публичный интерфейс кубика будет просто обращаться к этому тулкиту. Экземпляр тулкита даже в состояние кубика складывать не за чем, т.к. он все равно оперирует данными по ссылке.

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

    @MarkusD Куратор тега C++
    Ben L,
    и одному из них придется получить свойства от друнгого.

    минуя публичный интерфейс и, собственно, инвариант типа?
  • Как правильно выстроить логику кода с соблюдением принципов ООП?

    @MarkusD Куратор тега C++
    lipa44, так не пойдет. П3.8 регламента работы сервиса.
    Тебе стоит удалить изображения и вставить код текстом. Мне мои глаза дороже, я не буду читать мыльный текст с изображений.
  • Как правильно выстроить логику кода с соблюдением принципов ООП?

    @MarkusD Куратор тега C++
    lipa44,
    Я подключил к заголовочному файлу другой заголовочные файл, который называется «решение кубика», но после попытки объявить элемент класса кубик в этом заголовочном файле или принять в качестве параметра функции, мне среда разработки говорит (can’t resolve type “rubikCube”), хотя я просто создаю/принимаю переменную того типа, которая у меня прописана в заголовочном файле, который я подключил.

    Давай вот этот момент посмотрим в твоем коде. Выпиши в сокращенном виде свои заголовки, оставив в них только описываемые тобой строки кода.
    У тебя должно получиться что-то вроде этого
    // cube.h
    ...
    #include ???
    ...
    class Cube
    {
    ...
    };
    
    // solutions.h
    ...
    class Solution
    {
    ...
    };

    Со всем остальным будем разбираться по ходу дела.
  • Как правильно выстроить логику кода с соблюдением принципов ООП?

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

    Такие алгоритмы решения уже неправильные.
    реально ли это на практике и у меня просто не получается это сделать или так и должно быть?

    Да, это реально. Но сперва нужно понять твои собственные проблемы и заблуждения. Кажется, в отношении ООП у тебя их много.
    Если сам класс кубика нельзя заставить видеть заголовочные файлы и использовать в них приватные поля кубика без наследования

    Почему заголовочные файлы должен видеть именно класс, а не транслятор твоего кода? Почему класс кубика должен иметь родителя? Почему поворот грани должен быть именно типом, а не функцией? Почему шаг решения задачи должен быть типом, а не функцией?
  • Паттерн "Фабричный метод": как получить конкретный продукт из конкретной фабрики?

    ragnar_ok , ознакомься с вопросом и его решением.
    У тебя точно такая же путаница в голове сложилась, как и у автора того вопроса.
    И вот еще один вопрос на ту же тему, для большей конкретики.
  • Что означают просто { тут блок кода } в с++?

    @MarkusD Куратор тега C++
    IliaNeverov, на будущее. Прояви внимательность. Я попросил у тебя код вокруг участка, а не внутри него.
    Текущие решения все верно объясняют.
  • Что означают просто { тут блок кода } в с++?

    @MarkusD Куратор тега C++
    IliaNeverov , все зависит от контекста окружающего кода.
    Тебе надо показать код вокруг интересующего тебя участка.
  • Почему код неработает?

    @MarkusD Куратор тега C++
    galaxy , ответ, конечно, в регламент работы сервиса не вписывается сразу по множеству пунктов, но проблему, бесспорно, объясняет. :)
  • Как на физическом уровне происходит прошивка нового выращенного процессора или любого другого микроэлектронного устройства?

    AnnPartovi
    Мозг человека имеет с рождения способность распознать цвета, звуки, образы, лица и кучу-кучу другой информации

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

    @MarkusD Куратор тега C++
    IliaNeverov, если описывать словами, то в идеале тебе потребуется N текстур с абсолютно идентичной топологией. Далее тебе потребуется геометрия, на которую абсолютно любая из N текстур будет накладываться абсолютно идентично с остальными.
    Ты получаешь пул из N текстур и персистентную геометрию.
    Далее тебе потребуется N буферов констант, в каждом из которых будет просто индекс слота текстуры.
    Твой шейдер вершин должен принимать геометрию и дописывать в нее индекс из текстуры подключенного константного буфера. А растровый шейдер просто должен семплировать текстуру из слота с требуемым индексом.
    Все. Это будет твоим простым решением.
  • Как привязать текстуру к определенному VAO?

    @MarkusD Куратор тега C++
    IliaNeverov , привязать текстуру к VAO невозможно. Для конвейера топология твоей геометрии, наличие на ней материалов и связанные с этим всем шейдеры являются всего лишь конструкционными элементами. Это тебе самому, в своем коде, своими логическими конструкциями необходимо задать требуемые для тебя связи между текстурами, шейдерами, вершинами и индексами со всем прочим.
    Текстурные блоки - это одно. Текстурные слоты - это другое. Текстурные блоки, или блоки растеризации, разведены непосредственно на кристалле GPU и отвечают за процессинг растеризации.
    Текстурные слоты шейдерной программы позволяют для одной геометрии задать несколько (до 16ти для тебя) текстур. При этом, действительно, можно добиться результата, когда геометрия будет одна и отображаться на ней будет только одна текстура (из 16ти), но при каждой отрисовке отображаться будет другая текстура.
    Все зависит от того, какой шейдер ты поставишь для обработки твоей геометрии.
  • Какая ошибка в коде?

    @MarkusD Куратор тега C++
    mercy_smile , а вопрос у тебя в чем?
  • Какой тип данных использовать?

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