Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Friend класс: вопрос, безопасности доступа 
V
    Опции темы
Rickert
  Дата 23.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Есть класс Б, который является friend'ом класса A. У класса А есть несколько private параметорв.
Вопрос: стоит ли какая-то угроза безопасности доступа к private'ам класса А? Ведь по сути - private'ы - нужны для того, чтобы закрыть нежелательный запрос к определённым параметрам, а тут его открывают smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Anikmar
Дата 23.1.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Дружественный класс имеет доступ к private секции класса.

Что такое нежелательный запрос?
PM MAIL ICQ   Вверх
Sartorius
Дата 23.1.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

Ведь по сути - private'ы - нужны для того, чтобы закрыть нежелательный запрос к определённым параметрам


 А друзья нужны что бы его открыть smile  Поскольку дружественные функции и класс требуют указания в описании класса, которое доступно только разработчику, а не пользователю этого класса, то никакой угрозы нет. ( Главное ведь скрыть поля от прямого изменения пользователем  smile )

Это сообщение отредактировал(а) Sartorius - 23.1.2007, 17:34
PM MAIL ICQ   Вверх
Anikmar
Дата 23.1.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Sartorius @  23.1.2007,  17:33 Найти цитируемый пост)
Главное ведь скрыть поля от прямого изменения пользователем

Пользователю доступно описание класса. А если возьмет и вставит строчку friend... Или перенесет переменные из одной секции в другую? Линкер разве ругнется?


PM MAIL ICQ   Вверх
zkv
Дата 23.1.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Anikmar, конечно может, он может вообще ехе-шник в нех-редакторе подправить. Ведь секции private и protected создаются не для того чтобы усложнить пользователю жизнь, а совсем наооборот, чтобы показать какие методы ему следует использовать, а какие используются для внутренних нужд. Если он откроет доступ. то никто ругаться естественно не будет.
PM MAIL   Вверх
Sartorius
Дата 23.1.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Не знаю ругнется ли линкер, если поменять описание класса(добавить какого нибудь друга).  (скорее всего нет , так как это дело только компилятора) Менять h-ник можно сколько угодно, но ведь что бы реально можно было вызывать эту дружественную функцию , нада все перекомпилировать. А без реализации класса этого не сделать...   smile

Добавлено @ 18:02 
 Присоединяюс к  zkv. Секции - это не борьба за копирайт и т.п., а средство, которое позволяет превратить логические ошибки в синтаксические
PM MAIL ICQ   Вверх
Anikmar
Дата 23.1.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



zkv, Совершенно согласен. Секции предназначены для самоконтроля и дисциплины.

Этот вопросик я задал перекликаясь с первым постом:
Цитата(Rickert @  23.1.2007,  16:56 Найти цитируемый пост)
 Ведь по сути - private'ы - нужны для того, чтобы закрыть нежелательный запрос к определённым параметрам, а тут его открывают   


Пользователю нельзя ничего запретить - если захочет, все равно влезет. А вот сказать заранее, куда лезть не надо - это да.

По-моему друзья придуманы для запоздалого исправления ошибок в проектировании класса smile

Добавлено @ 18:05 
Цитата(Sartorius @  23.1.2007,  18:00 Найти цитируемый пост)
Менять h-ник можно сколько угодно, но ведь что бы реально можно было вызывать эту дружественную функцию , нада все перекомпилировать. А без реализации класса этого не сделать...

Вот я и спросил - ругнется линкер или нет?
Перкомпиляция самого класса не нужна, просто находятся ли члены из приват-секции в таблице символов линкера?
PM MAIL ICQ   Вверх
Sartorius
Дата 23.1.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

По-моему друзья придуманы для запоздалого исправления ошибок в проектировании класса    


 Может и так smile , но бывают случаи, когда друзья оказываются очень удобны. Ну например, при переопределении двухместных операций.... думаю при желании можно предумать множество примеров
PM MAIL ICQ   Вверх
Anikmar
Дата 23.1.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Sartorius @  23.1.2007,  18:07 Найти цитируемый пост)
Может и так  , но бывают случаи, когда друзья оказываются очень удобны. Ну например, при переопределении двухместных операций.... думаю при желании можно предумать множество примеров 


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

Думаю  есть очень много оснований для использования друзей в более общем случае.
PM MAIL ICQ   Вверх
Rockie
Дата 23.1.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Sartorius @  23.1.2007,  17:33 Найти цитируемый пост)
 ( Главное ведь скрыть поля от прямого изменения пользователем   smile  )

пользователь? всмысле тот что кнопы жмакает? smile от такого вообще ничего не скроешь, все поломает! smile

Цитата(Anikmar @  23.1.2007,  18:11 Найти цитируемый пост)
 потом понадобился новый функционал, а класс лопатить уже неохота - результат появление друга...

то есть объявить друга можно было а дописать метод, который бы обращался к приватным полям нельзя было?




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Anikmar
Дата 23.1.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Rockie @  23.1.2007,  20:24 Найти цитируемый пост)
то есть объявить друга можно было а дописать метод, который бы обращался к приватным полям нельзя было?


Именно так. Класс вызывал форму, которая при закрытии должна была обнулить указатель на саму себя. Было лень писать метод - так как таких форм было порядка 10 (изначально ошибся в выборе стратегии - думал они будут модальные, а оказалось что неудобно работать)
Чем писать 10 методов (ну лень мне стало!) я обявил 10 форм друзьями.  smile 

ИМХО Работает и ладно! - не для преподавателя, для себя пишу.
PM MAIL ICQ   Вверх
KelTron
Дата 24.1.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(Rockie @  23.1.2007,  20:24 Найти цитируемый пост)
пользователь? всмысле тот что кнопы жмакает?  от такого вообще ничего не скроешь, все поломает! 

В данном случае пользователь это программист, при чем тут тот кто кнопки жмет


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Rockie
Дата 25.1.2007, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(KelTron @  24.1.2007,  10:05 Найти цитируемый пост)
В данном случае пользователь это программист, при чем тут тот кто кнопки жмет

KelTron, при том, что тот кто кнопки жмет, в состоянии поломать абсолютно все =)

Добавлено @ 03:15 
KelTron, вообще любое сообщение стоит рассматривать в контексте 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Earnest
Дата 25.1.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Anikmar @  23.1.2007,  19:03 Найти цитируемый пост)
Вот я и спросил - ругнется линкер или нет?

Если изменить доступ, но не перекомпилировать библиотеку, то да: реальные имена включают модификаторы доступа, по крайней мере в MSVC. На добавление friend - нет.

Цитата(Anikmar @  23.1.2007,  22:36 Найти цитируемый пост)
Работает и ладно! - не для преподавателя, для себя пишу. 

С таким подходом быстро допишешься...


--------------------
...
PM   Вверх
Anikmar
Дата 25.1.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Earnest @  25.1.2007,  09:07 Найти цитируемый пост)
С таким подходом быстро допишешься... 


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

PM MAIL ICQ   Вверх
skyboy
Дата 25.1.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(Sartorius @  23.1.2007,  17:07 Найти цитируемый пост)
Ну например, при переопределении двухместных операций.... думаю при желании можно предумать множество примеров 

выходил ещё пример: модель ассоциативной операции. например, вычисление силы притяжения между двумя объектами. если делать методом, принимающим в качестве аргумента второй объект, то надо будет сделать в классе доступ к данным о массе, которая другими классами востребована не будет. но, даже если захламленность пространства имен свойствами, используемыми разово, не волнует, то есть ещё проблема логики: от какого объекта отталкиваться? почему при вычислении силы притяжения между Землей и Солнцем надо использовать метод объекта Солнце? разве Земля не притягивает Солнце?! А функция таких вопросов не вызывает - два аргумента; оба равноправные...
PM MAIL   Вверх
Earnest
Дата 25.1.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Anikmar @  25.1.2007,  13:15 Найти цитируемый пост)
Спорный момент. Это не является критической ошибкой в подходе и никоим образом не приведет к косякам - так как и класс и формы находятся в одной библиотеке, и даже если другой программист будет этой библиотекой пользоваться ничего страшного не произойдет.

Ну-ну... по принципу - вроде, работает и ладно. Ты часто занимался поддержкой и модификацией подобного кода (особенно чужого)?
Это очень плохой подход, поверь...



--------------------
...
PM   Вверх
Anikmar
Дата 25.1.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Earnest @  25.1.2007,  17:03 Найти цитируемый пост)
Ты часто занимался поддержкой и модификацией подобного кода (особенно чужого)?
Это очень плохой подход, поверь...

Я про конкретно указанный случай.
Модификации там быть не может - существует класс, существует документация по методам и свойствам, нечего туда лазить.
Если понадобится модифицировать форму - на указанный участок это никак не повлияет.
Если понадобится добавить новую форму - аналогично (не повлияет).

По поводу опыта такой работы - программистом я работал весьма недолго (около 5 лет) и всякое разное бывало, зачастую заново написать было проще чем разобраться в чужих каракулях, но и разбираться приходилось. Сейчас я сменил род деятельности и пишу для себя всякие разные примочки, поэтому врядли кто-то будет разбираться в моем коде, главное, чтобы я сам в нем смог разобраться через некоторое время smile, проект пухнет как на дрожжах, сам его уже боюсь.

В других случаях, кроме указанного, мне не доводилось использовать друзей класса - всегдя старался обойтись методами класса (и свойствами билдера).


Цитата(Earnest @  25.1.2007,  17:03 Найти цитируемый пост)
Ну-ну... по принципу - вроде, работает и ладно. 

Как раз очень правильный принцип. Работает правильно - не лезь! Иначе работа над проектом превратится в постоянную оптимизацию. Оптимизацию начинай в новой версии продукта, когда старая версия уже работает.
PM MAIL ICQ   Вверх
Rockie
Дата 25.1.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



skyboy, дык это не friend-функция, а просто глобальная функция, принимающая объекты. Нет необходимости напрямую лезть и изменять члены-данные участников солнечной системы.

Цитата(Anikmar @  25.1.2007,  17:14 Найти цитируемый пост)
 проект пухнет как на дрожжах, сам его уже боюсь.

такое ощущение, что вас это распухание радует smile 

Цитата(Anikmar @  23.1.2007,  21:36 Найти цитируемый пост)
Именно так. Класс вызывал форму, которая при закрытии должна была обнулить указатель на саму себя. Было лень писать метод - так как таких форм было порядка 10 (изначально ошибся в выборе стратегии - думал они будут модальные, а оказалось что неудобно работать)
Чем писать 10 методов (ну лень мне стало!) я объявил 10 форм друзьями.   

То есть есть класс-менеджер форм, в котором содержится указатель на форму, и формы должны иметь возможность его менять?

Добавлено @ 22:03 
В одной из подчиненных форм создаем метод, принимающий объект класса-менеджера и изменяющий указатель в нем при помощи get/set класса-менеджера. Остальные 9 форм наследуем.




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Rockie
Дата 25.1.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Sartorius @  23.1.2007,  18:07 Найти цитируемый пост)
но бывают случаи, когда друзья оказываются очень удобны. Ну например, при переопределении двухместных операций....

если имеется ввиду перегрузка то это стандартная техника. как раз для
Цитата(skyboy @  25.1.2007,  13:32 Найти цитируемый пост)
 ассоциативной операции


Цитата(Rickert @  23.1.2007,  16:56 Найти цитируемый пост)
Вопрос: стоит ли какая-то угроза безопасности доступа к private'ам класса А?

У тебя есть класс A. Класс B пишет сосед Вася Пупкин. Класс B объявлен другом в твоем классе A.  Пришедши домой после корпоративной вечеринки, Вася Пупкин садится за компьютер и устанавливает переменную size твоего массива в -1000.

Добавлено @ 22:20 
А еще лучше, если Вася установит размер массива в -1000 при снятии третьей снизу галки на пятой вкладке твоего приложения. Тогда о новом размере массива узнает уже пользователь smile 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Anikmar
Дата 26.1.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Rockie @  25.1.2007,  22:00 Найти цитируемый пост)
такое ощущение, что вас это распухание радует  

Это смех сквозь слезы. Нисколечко не радует - так как конца и края нет, а хотелось бы, чтобы хоть что-то заработало. Погоня за универсализмом и всеохватыванием подвела...
Цитата(Rockie @  25.1.2007,  22:00 Найти цитируемый пост)
То есть есть класс-менеджер форм, в котором содержится указатель на форму, и формы должны иметь возможность его менять?

Где-то так. Класс содержит логически законченный объет. Есть набор форм, которые позволяют им управлять. При завершении работы форма должна об этом сообщить классу. Из простых методов пришло на ум два: вызов метода класса, если необходимо предпринять дополнительные действия и тупой обнуление указателя на форму, если таковых действий не нужно (например, для форм диагностики). Со стороны "пользователя" можно пользоваться только методами, например ShowSatistic, следовательно сам указатель на форму пользователю видеть не надо, он в protected секции. Вот и родилась идея "друга" чтобы не писать кучу методов из одной строчки F_StatShow = NULL...

Сейчас я такой подход изменил - я в форму при инициализации передаю адрес переменной, которую надо обнулить. Но старые участки остались с такой реализацией.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1137 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.