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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Friend класс: вопрос, безопасности доступа 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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