Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
-47 / 3 / 0
Регистрация: 31.12.2017
Сообщений: 204

Это и есть так называемое сокрытие данных?

06.11.2018, 20:32. Показов 2111. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
class myclass
{
    int a;
public:
    int &geta();
} myclass1;
 
int &myclass::geta()
{
    return a;
}
 
int main()
{
    myclass1.geta()= 2018;
    cout << myclass1.geta();
}
Результат работы программы: 2018
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2018, 20:32
Ответы с готовыми решениями:

Очистка полей ввода данных и сокрытие группы объектов набора данных
Добавьте в обработчик button2 очистку полей ввода данных и сокрытие группы объектов набора данных, как это сделано в обработчике button3....

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

Потоки и сокрытие данных
Всем доброго времени суток. Появился вопрос, касающийся потоков. Есть класс, в котором имеются функции для вывода внутренних данных в...

12
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
06.11.2018, 22:22
Jzx, нет.
Вы возвращаете ссылку на внутренний элемент, с которым потом кто угодно может делать что угодно.
Это как построить высокий крепкий забор, поставить самый сложный замок на ворота, а потом отдать набор ключей ворам.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
06.11.2018, 22:49
Лучший ответ Сообщение было отмечено Jzx как решение

Решение

Цитата Сообщение от Jzx Посмотреть сообщение
Это и есть так называемое сокрытие данных?
Да, разумеется. Это один из вариантов сокрытия реализации (или сокрытия данных - как вам больше нравится).

В данном случае вы даете клиентам вашего класса полный контроль над неким свойством a, т.е. даете клиентам доступ к этому свойству, как к lvalue. Клиентский код может использовать оператор присваивания, чтобы читать данные через полученную ссылку, записывать данные через полученную ссылку, а также [возможно] оператор взятия адреса, чтобы формировать указатель на полученное lvalue. Однако при этом вы скрываете от клиентов место физического хранения этого элемента данных - он может быть членом класса myclass, а может и не быть, т.е. храниться где-то совсем в другом месте.

При этом возможность формирования указателя - это потенциально присутствующий в этом варианте дополнительный уровень сокрытия: потенциальная возможность того, что в будущем метод geta перестанет возвращать голую ссылку, а начнет возвращать некую "псевдо-ссылку", т.е. прокси-класс, который по-прежнему будет поддерживать чтение и запись свойства через оператор присваивания, но запретит клиентскому код формировать указатели на это свойство. Может такое изменение возыметь место в будущем или не может - это вопрос вашего дизайна, который вы должны оговаривать отдельно "на словах".

Полный lvalue-доступ, как в вашем примере - самый слабый вариант сокрытия реализации. Однако и он, как видите, предоставляет определенный уровень сокрытия по сравнению с просто публичным полем.
2
Just Do It!
 Аватар для XLAT
4210 / 2667 / 655
Регистрация: 23.09.2014
Сообщений: 9,077
Записей в блоге: 3
07.11.2018, 11:47
Цитата Сообщение от New man Посмотреть сообщение
Это как построить высокий крепкий забор, поставить самый сложный замок на ворота, а потом отдать набор ключей ворам.
какой набор ключей? это же интерфейсная часть в априори доступная любому юзеркодеру.
и этот любой изеркодер может через паблик менять нутро привата.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
07.11.2018, 17:28
Лучшей иллюстрацией сокрытия данных будет что-то вроде такого:
C++
1
2
3
4
5
6
7
class myclass{
  private:
    int a;
  public:
    int GetA(){return a;}
    void SetA(int _a){a=_a;}
} myclass1;
Здесь, если юзер не знает деталей реализации (например, если код GetA и SetA вынесен в *.cpp файл), он не будет знать, существует ли вообще переменная a и какого она типа.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
07.11.2018, 18:35
Цитата Сообщение от New man Посмотреть сообщение
Это как построить высокий крепкий забор, поставить самый сложный замок на ворота, а потом отдать набор ключей ворам.
Сокрытие реализации - это не защита от воров.

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

C++
1
2
3
4
5
6
7
8
class myclass
{
public:
    int a;
};
 
...
int myclass::*p = &myclass::a;
А в исходном варианте, несмотря на его высокую степень открытости, этого сделать невозможно. Так что "ворам" отданы не все ключи.

Цитата Сообщение от XLAT Посмотреть сообщение
и этот любой изеркодер может через паблик менять нутро привата.
И? Что именно вы хотите этим сказать?

Если разработчику класса нужно публично-доступное свойство, которое физически реализуется полем этого же класса, то так и получится: юзер будет "через паблик менять нутро привата". Как и должно быть.

В данном примере вызывает удивление возврат ссылки на поле, что является существенно более слабой формой сокрытия реализации, чем пара setter/getter, но тем не менее и здесь присутствует сокрытие реализации.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
07.11.2018, 19:05
Сама идея сокрытия реализации / данных заключается не в том, чтобы никто и никогда не получил к ним доступа. При "правильной" реализации объекта (или библиотеки, или еще какого-то модуля) он должен представляться черным ящиком, назначение которого можно понять и без информации о внутреннем устройстве. Это отчасти психологический стимул снижать связность, выделяя сильно связанные друг с другом участки в один модуль и оставляя лишь необходимый минимум ручек и кнопочек для взаимодействия. В результате разработчику не приходится держать в голове всю структуру программы и каждый раз достаточно только одного уровня абстракции.
Например, при написании скрипта используется только его уровень абстракции, а все утилиты считаются черными ящиками, у которых есть входы и выходы (ключи запуска, stdin и stdout). Как именно устроена каждая из них значения не имеет. Если на программу придет обновление и полностью изменит ее структуру, внешний скрипт этого даже не заметит (хорошо бы если бы так, эх...). Если спуститься на уровень ниже, на реализацию какого-то отдельного "кирпичика", ситуация повторяется: нам безразлично, кто и с какой целью будет вызывать нашу программу и нам безразлично (в определенной мере), как именно устроены используемые библиотеки.
Поэтому реализация ТСа не является удачным примером. Он дает пользователю бесконтрольный доступ к полю класса. То есть класс сам не знает, когда это поле изменится. Это увеличивает связность: теперь класс обязан считать, что поле может измениться когда угодно, он не может, например, использовать это поле в расчете какого-нибудь сложного выражения для повторного использования (а вдруг поле изменится и придется пересчитывать выражения, а объект-то об этом не знает).
1
Just Do It!
 Аватар для XLAT
4210 / 2667 / 655
Регистрация: 23.09.2014
Сообщений: 9,077
Записей в блоге: 3
07.11.2018, 19:15
https://rextester.com/UFM18971
теперь можно спать спокойно, правильный год уже никто не украдет)
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
07.11.2018, 19:19
XLAT, при одновременном использовании в нескольких потоках будет ошибка. В том числе если будешь обращаться к разным объектам (переменная-то статическая). Лучше её (временную переменную) тоже делать членом класса.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
07.11.2018, 19:27
Цитата Сообщение от XLAT Посмотреть сообщение
теперь можно спать спокойно, правильный год уже никто не украдет)
??? Из geta возвращается именно ссылка как раз для того, чтобы дать возможность клиентскому коду менять год. А вы зачем-то подавили эту возможность. Где смысл?

Если бы задача состояла в том, чтобы не допустить модификации года, geta бы возвращала просто int.
0
Just Do It!
 Аватар для XLAT
4210 / 2667 / 655
Регистрация: 23.09.2014
Сообщений: 9,077
Записей в блоге: 3
07.11.2018, 20:09
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
реализация ТСа не является удачным примером. Он дает пользователю бесконтрольный доступ к полю класса.
ТС ничаво никому не дает, я сам могу залезть в интерфейсную часть любого класса и добавить такой код на любую переменную, которую "типа спрятали" в приват.

Цитата Сообщение от TRam_ Посмотреть сообщение
Лучше её (временную переменную) тоже делать членом класса.
ок.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
??? Из geta возвращается именно ссылка как раз для того, чтобы дать возможность клиентскому коду менять год. А вы зачем-то подавили эту возможность. Где смысл?
да ладно, поверьте я высоко ценю силу сетерогетерной идиомы)
да, подавил из чисто академического интереса)))

Так или иначе термин Истинного Сокрытия Данных обыгрывается у крестоджедаев, например, у того же Дьюхерста в сторону того что это может быть весьма полезно в плане гигиены(защиты от грязных рук).

Далее могу добавить про случай, когда значение одной переменной должно быть строго согласованно со сотней других значений и тут джунир говорит лиду, мол, что за бездарь подавил мне возможность поменять эту а, мол тот кусок что я разраблю будет работать лучше, если я буду каждый раз менять эту а под себя.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
08.11.2018, 09:33
Цитата Сообщение от XLAT Посмотреть сообщение
я сам могу залезть в интерфейсную часть любого класса и добавить такой код на любую переменную, которую "типа спрятали" в приват.
Но для этого придется приложить усилия и есть шанс что задумаетесь, а так ли это надо и не приведет ли к непредсказуемым последствиям в будущем.
Повторяю:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Сама идея сокрытия реализации / данных заключается не в том, чтобы никто и никогда не получил к ним доступа.
0
Just Do It!
 Аватар для XLAT
4210 / 2667 / 655
Регистрация: 23.09.2014
Сообщений: 9,077
Записей в блоге: 3
08.11.2018, 10:30
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Повторяю:
а я вам запруфил крестаджедая Дьюхерста, читайте про истинное сокрытие данных в его советах.
у других крестогуру тож эта тема обсуждается.

наверно же неспроста, а чтобы увеличить шанс избежания непредсказуемых последствий в будущем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2018, 10:30
Помогаю со студенческими работами здесь

Зачем в scanf писать тип данных, если в начале программы это и так пишется?
если переменная a имеет тип integer , то зачем это указывать в printf???

Инкапсуляция и сокрытие данных не одно и тоже?
Вопрос:защита данных от несанкционированного доступа другими функциями называется?я ответил инкапсуляция,а в ответе сокрытие данных.Это не...

Сокрытие повторяющихся данных при постороении
Здравствуйте уважаемые! Моя проблема проста, но тупиковая. А может и наоборот. Значит, есть данные из БД. На их основе формируется...

Для чего было придумано сокрытие данных в ООП?
Кто может понятно объяснить это? Т.е. для чего мы объявляем поля класса как private , почему обычно не объявляют их как public ? для чего...

В общем есть такая вот штука: TPS 19.70 (19.91 19.97 19.97 19.99), что это, и к каким типам передачи данных относится?
TPS 19.70 (19.91 19.97 19.97 19.99)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru