170 похожих чатов

Для чего может понадобиться включать один класс в другой?

25 ответов

23 просмотра

инкапсуляция

Слава Україні
инкапсуляция

Ага, так и вижу у себя на борде тикет: "как ПО, я хочу инкапсуляцию".

. .
Ага, так и вижу у себя на борде тикет: "как ПО, я ...

Мелкие запросы! Требования должны быть более высокоуровневыми!

Причины самые разные. Последнее, что встречал - валидация и проверка корректности, зашитые внутрь класса, поставляемого клиенту. Чтобы он не "забыл" это, когда будет использовать наш класс в своем коде.

Мечтают ли электровеники об электроовцах?
Мелкие запросы! Требования должны быть более высок...

"как ПО я хочу." Подходит?) В целом прекрасно описывает половину задач, которые к нам прилетают до рейфаймента.)

. .
"как ПО я хочу." Подходит?) В целом прекрасно опи...

Шыкарно! Думаю, этого достаточно. А потом уже декомпозировать. :)

Принадлежность сущностей. Вот есть, например, класс управлятор, и у него есть настройки. Настройки можно положить в struct, объявление которого размещено внутри класса. То же с методами, которые оперируют большим набором аргументов - не перечислять же все 10 штук в прототипах функций. Кастинг через union ещё может понадобиться, которому незачем торчать наружу. Qt выносило реализацию публичного API во внутренний класс, чтобы при изменениях кода весь qt не перепоставлять (API не менялось)... Много чего можно придумать

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

О, там ещё один хороший ответ дали, а я ещё накину. Боюсь обосраться перед почтенной публикой, но ещё есть различные паттерны типа pointer to implementation. Собственно, основной класс служит интерфейсом, а внутри объявляется (и далее описывается) класс, который на деле все реализует. По сути, я немного обобщил чужой ответ, но что уж😂😂 Тоже полезная штука, но я своими словами не опишу - лучше гуглить. А то точно обосрусь.

Vyacheslav
Принадлежность сущностей. Вот есть, например, клас...

Про простую инкапсуляцию не соглашусь, т.к. прятать можно внутри анонимных namespace'ов внутри cpp файлов. Поэтому и сделал акцент на _принадлежность_. Тут решающую роль играет удобство использования и незамусоривание неймспейсов проекта

Vyacheslav
Про простую инкапсуляцию не соглашусь, т.к. прятат...

вы не путаете инкапсуляцию с сокрытием?

. .
О, там ещё один хороший ответ дали, а я ещё накину...

Так публичное API в Qt было раньше сделано. Сейчас стали суффикс Private добавлять. Но ничего не мешает это объявление вовнутрь класса спрятать. https://github.com/qt/qtbase/blob/dev/src/widgets/widgets/qscrollarea.h#L50

vile
вы не путаете инкапсуляцию с сокрытием?

Сокрытие в моем понимании - это часть инкапсуляции. Что private, что сокрытие снаружи класса не отличаются (за исключением хаков с копированием декларации без модификаторов доступа, чтобы достучаться до private полей, которое является UB). protected - другое дело, но тут сначала нужно иметь внутренний метод protected, чтобы ему передавать protected подкласс.

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Vyacheslav
Сокрытие в моем понимании - это часть инкапсуляции...

а у вас модификатор доступа можно только на методы вешать, на данные нельзя?

Vyacheslav
Сокрытие в моем понимании - это часть инкапсуляции...

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

vile
а у вас модификатор доступа можно только на методы...

Можно и на данные, но мы тут про подклассы говорили. Согласен, что может потребоваться создать protected поля из protected подклассов, но я такое на практике ни разу не встречал.

András
"копированием декларации без модификаторов доступа...

Два .h файла. В одном объявление класса с модификаторами доступа, в другом - то же объявление класса, только модификаторы доступа все public.

Vyacheslav
Два .h файла. В одном объявление класса с модифика...

Сейчас не вспомню, по каким правилам компилятор может перетасовать vtbl и поля, но эти правила можно подобрать, если очень очень нужно.

Denis P
Может определение?

У класса есть определение и объявление и они разные? Я думал определение и объявление определены только у методов и static полей.

Denis P
class A;

Это forward declaration. Объявление наперёд. Готов признать другую терминологию, если вы сошлётесь на авторитетный источник.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта