|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.08.2013, 21:03 | #11 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Если ты внимательно-внимательно читал то правило Мейерса, то заметил, что он грит примерно так "в нашем случае интерфейса будет достаточно, поэтому дружба не нужна". Но ведь может быть много вариантов, когда интерфейса не хватит. - допустим тебе также требуется неявно приводить типы, но в классе есть данные, которые ты не хочешь предоставлять всем подряд (геттер делать по каким-то причинам опасно), но вот этой функции те защищенные данные нужны. Пример высосан из пальца, у меня такого не было. Но в любом случае, я не вижу ничего плохого в дружественной функции. Дружба - это плохо, потому что это очень сильная связь (сильнее чем композиция). Между дружественной функцией и классом связь примерно такая же сильная как между классом и его методом. Но ведь никто не говорит что методы - плохо )). Плохо - это дружба между классами - это факт. А задание среднестатистическое, нормально ) Студент тоже среднестатистический - хреновый. |
|
16.08.2013, 21:06 | #12 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Цитата:
Цитата:
Вот пример плохого кода, когда оператор является членом класса: Код:
по этой ссылке: http://lib.rus.ec/b/269732/read Последний раз редактировалось 8Observer8; 16.08.2013 в 21:16. |
||
16.08.2013, 21:11 | #13 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Цитата:
Цитата:
|
||
16.08.2013, 21:16 | #14 | |||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Немного не в тему. Неявное приведение типов, на которое упирает тут Мейерс - тоже плохо. Чисто гипотетически, ты напишешь 2 функции f(complex &, complex &); f(rational &, rational &); вызовешь f(1,1). Если и comlex и rational могут неявно привестись - какая функция будет вызвана? - если верить Страуструпу - "вызывается наиболее подходящая". Вобщем поэтому писать complex a(1), b = 2 + a; уже нехорошо. Цитата:
|
|||
16.08.2013, 21:23 | #15 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Написал я выше про опасности всякие и даже покритиковал советы Мейерса, а вот пример, только что придумал (чуть подправил пример с cplusplus):
Код:
(ну вобщем поэтому весь шум вокруг выноса функции из класса у Мейерса спорный очень). Если ты хочешь сложить число и комплектное число - так и пиши b = complex(2) + a; // начало смотри в 14 посте Вобщем, у Мейерса годные хорошие советы, но народная мудрость не зря грит "доверяй, но проверяй" Последний раз редактировалось rrrFer; 16.08.2013 в 21:26. |
16.08.2013, 21:50 | #16 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Цитата:
Нужно сразу правильно учиться делать, чтобы на работе потом по голове не настучали. Разработчику нужно учиться предугадывать действия пользователя. Этому и учит Мейерс на данном примере. Причём пример то один в один! |
|
20.08.2013, 23:27 | #17 |
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
Я не читал все последующие обсуждения, но мне кажется, что проблема заключается в том, что, ИМХО, методы классов не должны содержать операторов ввода/вывода. Единственное, что ему можно сделать, вернуть результат, а вывод на экран - уже извне, то есть, в основной программе.
|
21.08.2013, 03:47 | #18 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Главное, меня интересует "почему нельзя?", "почему не должны?" - пусть даже речь об экране идет. Последний раз редактировалось rrrFer; 21.08.2013 в 04:00. |
|
21.08.2013, 09:58 | #19 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Ну вот бредовая аналогия - я вот посчитал на калькуляторе два числа, а они хлоп! и сами на бумажку записались. Блин, удобно, но записываются карандашом. А мне надо ручкой гелевой.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 21.08.2013 в 10:00. |
|
21.08.2013, 10:45 | #20 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Что-то я запутался... В противоположенность оператору вывода - операция умножения целого числа на дробь свойственна дробям?
Код:
Противоречие. С одной стороны, операция умножения свойственна дробям. Значит оператор умножения должен быть членом класса. С другой стороны, язык не позволит определить оператор умножения внутри класса, который принимает два аргумента . Точнее, если оператор внутри класса, то он принимает правый параметр через аргумент, а левый через this. И тогда умножение числа на дробь будет невозможна: Код:
Последний раз редактировалось 8Observer8; 21.08.2013 в 11:02. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с классами | АндрейBAN | C# (си шарп) | 4 | 17.12.2012 13:10 |
Работа с классами на С++ | darinadarina | Помощь студентам | 1 | 08.05.2012 18:34 |
Работа с классами | petrovich2005 | Помощь студентам | 2 | 24.06.2011 17:32 |
Работа с классами | Superlotles | Общие вопросы C/C++ | 6 | 16.06.2010 17:15 |
С++: работа с классами | MR_Andrew | Общие вопросы C/C++ | 23 | 01.04.2010 23:46 |