Где же эта инкапсуляция?

156
05 апреля 2019, 14:00

Небольшой уточняющий вопрос по классам C++.

Допустим, в классе есть метод. В этот метод передается параметр типа того же самого класса, в котором объявлен метод.

class A
{
...
public:
void Test(A& obj);
...
};

Методом проб и ошибок было установлено, что я могу спокойно изменять приватные члены класса, переданному в Test внутри метода. Я не понял, и где же тогда эта ваша инкапсуляция? Что-то в учебниках ответа не нашел, по каким тегам гуглить не знаю. Заранее спасибо.

Answer 1

Попробую объяснить доступными средствами что такое инкапсуляция.

Берем обычные механические часы - бьюсь в заклад, что 99% людей слабо представляют внутреннее устройство часового механизма - ну да там шестеренки, пружинки, маятник и проч. Но ведь все пользуются этими часами - индусы, китайцы, девочки, мальчики, пенсионеры, бандиты, президенты - в общем все. И все почему? Да потому что часы наружу выставляют 3-4 метода для работы с ними инкапсулируя в этих методах все свои пружинки, шестеренки и проч. винтики. Какие же это методы?

  • Показать время
  • Подвести стрелки
  • Завести механизм
  • Ну там подвести календарь, запустить секундомер и проч.

То же самое и с классами - инкапсуляция не означает полное скрытие данных, а это способ предотвращения бесконтрольного доступа.

Если вернуться к аналогии с часами, то инкапсуляция не есть священная корова - всегда найдется плохой мальчик, который вскроет заднюю крышку часиков и начнет туда-сюда крутить шестеренки.

Answer 2

Инкапсуляция - это способ предотвращения бесконтрольного доступа к внутренним (=приватным) элементам объекта извне. Использование методов класса для работы с внутренними структурами - это и есть инкапсуляция, поскольку это есть контролируемый доступ к внутреннему пространству объекта: пользователь имеет доступ только к тому, что позволит автор, и только так, как позволит автор.

Answer 3

Кстати, в языке Scala поля класса можно делать доступными только для объекта-владельца, похоже это то, что хочет ТС.

class Foo {                                                                                                                                                                   
    private[this] var privateVar = 1
    def changePrivateVar() {
        privateVar = 2  // OK
    }
    def bar(foo: Foo) {
        foo.privateVar = 2 // Не скомпилируется
    }
}

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

READ ALSO
Fresco dependency ломает aar библиотеку

Fresco dependency ломает aar библиотеку

Я импортирую unity3d проект как aar библиотеку в android проект

162
ITEXT7 создает pdf файл с Exception “Pdf indirect object belongs to other PDF document. Copy object to current pdf document.”?

ITEXT7 создает pdf файл с Exception “Pdf indirect object belongs to other PDF document. Copy object to current pdf document.”?

Я хочу создать pdf файл с использованием iText 7, но что-то не так:

176
Не распечатывается файл javax.print

Не распечатывается файл javax.print

пытаюсь распечатать файл, все отрабатывает без ошибок, Process finished with exit code 0 но файл не распечатываетсяпринтер рабочий, стандартными средствами...

145