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

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

25 ответов

21 просмотр

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

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

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

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

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

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

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

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

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

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

Принадлежность сущностей. Вот есть, например, класс управлятор, и у него есть настройки. Настройки можно положить в 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. Объявление наперёд. Готов признать другую терминологию, если вы сошлётесь на авторитетный источник.

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта