Небольшой уточняющий вопрос по классам C++.
Допустим, в классе есть метод. В этот метод передается параметр типа того же самого класса, в котором объявлен метод.
class A
{
...
public:
void Test(A& obj);
...
};
Методом проб и ошибок было установлено, что я могу спокойно изменять приватные члены класса, переданному в Test внутри метода. Я не понял, и где же тогда эта ваша инкапсуляция? Что-то в учебниках ответа не нашел, по каким тегам гуглить не знаю. Заранее спасибо.
Попробую объяснить доступными средствами что такое инкапсуляция.
Берем обычные механические часы - бьюсь в заклад, что 99% людей слабо представляют внутреннее устройство часового механизма - ну да там шестеренки, пружинки, маятник и проч. Но ведь все пользуются этими часами - индусы, китайцы, девочки, мальчики, пенсионеры, бандиты, президенты - в общем все. И все почему? Да потому что часы наружу выставляют 3-4 метода для работы с ними инкапсулируя в этих методах все свои пружинки, шестеренки и проч. винтики. Какие же это методы?
То же самое и с классами - инкапсуляция не означает полное скрытие данных, а это способ предотвращения бесконтрольного доступа.
Если вернуться к аналогии с часами, то инкапсуляция не есть священная корова - всегда найдется плохой мальчик, который вскроет заднюю крышку часиков и начнет туда-сюда крутить шестеренки.
Инкапсуляция - это способ предотвращения бесконтрольного доступа к внутренним (=приватным) элементам объекта извне. Использование методов класса для работы с внутренними структурами - это и есть инкапсуляция, поскольку это есть контролируемый доступ к внутреннему пространству объекта: пользователь имеет доступ только к тому, что позволит автор, и только так, как позволит автор.
Кстати, в языке Scala поля класса можно делать доступными только для объекта-владельца, похоже это то, что хочет ТС.
class Foo {
private[this] var privateVar = 1
def changePrivateVar() {
privateVar = 2 // OK
}
def bar(foo: Foo) {
foo.privateVar = 2 // Не скомпилируется
}
}
Насколько мне известно, в C++ нет возможности подобным образом ограничить доступ к полям класса.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я импортирую unity3d проект как aar библиотеку в android проект
Я хочу создать pdf файл с использованием iText 7, но что-то не так:
пытаюсь распечатать файл, все отрабатывает без ошибок, Process finished with exit code 0 но файл не распечатываетсяпринтер рабочий, стандартными средствами...