2015-09-08 3 views
2

Есть ли способ разбить энакапсуляцию класса? Ключевое слово друга может использоваться для одного и того же. Если я использую функцию или класс друга, тогда я могу получить доступ ко всем публичным и частным данным. Я хочу знать, есть ли другой способ для этого же. Это один из моих вопросов, связанных с интервью, я много искал, но не нашел убедительных ответов, надеюсь, что кто-то может мне помочь. Заранее спасибо.Нарушение инкапсуляции в C++

+0

Что вы нашли? – melpomene

+4

При правильном использовании «друг» достаточно мощный и усиливает инкапсуляцию, а не разрывает его. –

ответ

1

Это зависит от того, что вы, мужчины, нарушая инкапсуляцию. Как правило, все операции, выполняемые членами класса вне класса, могут рассматриваться как разрывное инкапсулирование класса.

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

0

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

Существует книга Херба Саттера, в которой обсуждаются эти и другие возможности. IIRC, это единственный, который имеет стандартное соответствие.

0

Все, что вы можете сделать в C, также возможно в C++.

Вы можете взять указатель на класс, нанести его на char *, обработать его как массив и начать переписывать память любым нужным вам образом, скорректировав все частные переменные-члены. Вы можете сделать это, даже если кто-то использует идиому pImpl, чтобы попытаться скрыть эти переменные от вас.

Ведение подобных вещей, как правило, является признаком запаха кода и большого зла ... Говорят, что путь в ад проложен с хорошими намерениями. :)

Но в целом, когда вы делаете переменную или функцию закрытой, вы действительно говорите «пожалуйста, не трогайте это». Следующий программист, который должен прийти, всегда может делать больше или меньше того, что они хотят, без изменения определения вашего класса. Функции «частный» и «публичный» на самом деле являются просто заявлениями о намерениях и способом неудобства тем, кто хочет идти против ваших намерений, и руководством к тому, кто не уверен, где они должны что-то искать. Это как замки на двери в ваш дом - любой, кто определен, может попасть в любом случае.

2

Я бы сказал, что friend не разрушает инкапсуляцию. См. https://isocpp.org/wiki/faq/Friends#friends-and-encap

Теперь давайте проигнорируем вопрос о том, что на самом деле означает «инкапсуляция». Как правило, можно получить доступ к частным членам, используя хакеры специализации шаблонов. Основная идея, когда класс имеет шаблон-член, объясняется в http://www.gotw.ca/gotw/076.htm.

Этот подход может быть расширен для доступа к любому частному члену данных или частной функции-члену класса, даже если класс не содержит шаблонов. См. http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html и http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html.

Смежные вопросы