инкапсуляция
Ага, так и вижу у себя на борде тикет: "как ПО, я хочу инкапсуляцию".
Мелкие запросы! Требования должны быть более высокоуровневыми!
Причины самые разные. Последнее, что встречал - валидация и проверка корректности, зашитые внутрь класса, поставляемого клиенту. Чтобы он не "забыл" это, когда будет использовать наш класс в своем коде.
"как ПО я хочу." Подходит?) В целом прекрасно описывает половину задач, которые к нам прилетают до рейфаймента.)
Шыкарно! Думаю, этого достаточно. А потом уже декомпозировать. :)
Принадлежность сущностей. Вот есть, например, класс управлятор, и у него есть настройки. Настройки можно положить в struct, объявление которого размещено внутри класса. То же с методами, которые оперируют большим набором аргументов - не перечислять же все 10 штук в прототипах функций. Кастинг через union ещё может понадобиться, которому незачем торчать наружу. Qt выносило реализацию публичного API во внутренний класс, чтобы при изменениях кода весь qt не перепоставлять (API не менялось)... Много чего можно придумать
Обычно делают чтобы спрятать реализацию своих данных внутри класса. Можно и неймспейс для этого же применять. Например, класс списка требует класс ноды списка. Map требует дерево и т. д. К инкапсуляции это не имеет отношения так уж явно, это просто организация кода
О, там ещё один хороший ответ дали, а я ещё накину. Боюсь обосраться перед почтенной публикой, но ещё есть различные паттерны типа pointer to implementation. Собственно, основной класс служит интерфейсом, а внутри объявляется (и далее описывается) класс, который на деле все реализует. По сути, я немного обобщил чужой ответ, но что уж😂😂 Тоже полезная штука, но я своими словами не опишу - лучше гуглить. А то точно обосрусь.
Про простую инкапсуляцию не соглашусь, т.к. прятать можно внутри анонимных namespace'ов внутри cpp файлов. Поэтому и сделал акцент на _принадлежность_. Тут решающую роль играет удобство использования и незамусоривание неймспейсов проекта
вы не путаете инкапсуляцию с сокрытием?
Так публичное API в Qt было раньше сделано. Сейчас стали суффикс Private добавлять. Но ничего не мешает это объявление вовнутрь класса спрятать. https://github.com/qt/qtbase/blob/dev/src/widgets/widgets/qscrollarea.h#L50
Сокрытие в моем понимании - это часть инкапсуляции. Что private, что сокрытие снаружи класса не отличаются (за исключением хаков с копированием декларации без модификаторов доступа, чтобы достучаться до private полей, которое является UB). protected - другое дело, но тут сначала нужно иметь внутренний метод protected, чтобы ему передавать protected подкласс.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
а у вас модификатор доступа можно только на методы вешать, на данные нельзя?
"копированием декларации без модификаторов доступа, чтобы достучаться до private полей" Можно пример?
Можно и на данные, но мы тут про подклассы говорили. Согласен, что может потребоваться создать protected поля из protected подклассов, но я такое на практике ни разу не встречал.
Два .h файла. В одном объявление класса с модификаторами доступа, в другом - то же объявление класса, только модификаторы доступа все public.
Сейчас не вспомню, по каким правилам компилятор может перетасовать vtbl и поля, но эти правила можно подобрать, если очень очень нужно.
Может определение?
У класса есть определение и объявление и они разные? Я думал определение и объявление определены только у методов и static полей.
Это forward declaration. Объявление наперёд. Готов признать другую терминологию, если вы сошлётесь на авторитетный источник.
http://eel.is/c++draft/class.name#example-3
Обсуждают сегодня