![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
иногда напрягает писать для класса методы устанавливающие и возвращающие значения
Как правило это значения простых типов. Не помню где (вроде на RSDN) в свое время нашел пример класса-свойств (чтоб избавиться от get/set)
используется слудующим образом
и тогда
но возникает проблемма при копировании объекта, т.к. меняется this. Поэтому этот класс закрыт от копировани. Но если классу С это необходимо, то приходится руками прописывать копирующий конструктор и оператор присваивания. Идея очень интересна. Да и в использовании удобна. Но только напрягают трудозатраты. Можно ли как проще это сделать ? |
||||||
|
|||||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
но ты их всё равно написал у класса С, заначит property эту проблему не решает. Да. но толку от неё мало. очень маленькое и спорное удобство. плюс явный перерасход памяти. на один int(4 байта, например) лишних как минимум 12 байт. 1-ый способ:
2-ой: если у вас в классе много сеттеров/геттеров, явно стоит задуматься об улучшении дизайна. |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: 1 Всего: 3 |
по моему, такие извращения со свойствами, описанными у тебя нежны лишь тогда, когда при изменении переменной тебе хочется автоматом выполнить и ещё какую - нибудь сопутствующую оперцию. Например, отобразить вновь введенное значение. То есть при использовании set ты не только приравняешь переменную нужному значению, но и сразу же её отобразишь.
А так лучше просто переопределять оператор равно:
И больше ничего не надо. Иногда может понадобиться без ссылки, то есть C operator=(C a), тогда делаешь не через memcpy а как нибудь по другому и усё. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Я лично, если в классе много простых значений свойств, делаю простую структуру и возвращаю\устанавливаю ее одним куском. Это если они логически связаны, скажем, параметры чего-нибудь. Согласитесь, глупо как-то на C++ возвращать\устанавливать, скажем, каждую координату прямоугольника отдельно.
-------------------- ... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Вопрос спорный. Согласитесь, не менее глупо заполнять структуру с кучей параметров, когда надо изменить лишь один. При этом, если я правильно понял, нужно еще ее предварительно зачитать, что бы получить значения тех параметров, которые меняться не будут. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
они никак не связаны
ну тогда все данные будут меняться, а если мне нужно выборочно ?
хм... довольно противоречивые мнения.... Если просто изменение данных, то лигично сделать их public. Но встает проблемма с сопровождение. Не использовать их вообще ? так что - stl и boost не правильно спроектированы ? И как возможно вообще избавиться ? |
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: 1 Всего: 3 |
Признаюсь честно, я делаю точно так же как и Earnest, пришел к этому со временем. А почему? Да потому, что при работе с кучей потоков так удобнее.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
кстати из ссылки Daevaorn, очень понравилось самое последнее сообщение
Если серьезно (и выбросить оттуда кучу прериканий), то объяснено очень доходчиво. Но вот пример. Я разбираю потоки данны с сетевых адаптеров и строю на основе этого иерархию. Я не всегда могу сразу определить некоторые данные (например IP-адрес). Но впоследствии я могу это сделать. Как мне изменить данные и потом получить их не используя get/set ? P.S. Или например есть класс, отвечающий за сигнализацию. Она может быть отключена/включена. Как ее включить без set? А в общем вывод понятен - ошибка реализации. Но я поверю окончательно, если вы привидете мне убедительные ответы на мои вопросы |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
zss
Не забивай голову. Когда я вижу getter и setter - это прежде всего для меня дополнительная информация о классе и .. программисте. То есть дав такой доступ, он мне неявно сообщил, что читать и записывать данные я могу в любое время и в любом порядке и следовательно, человек не просто принял решение от балды, а рассмотрел все его последствия, и принял решение осознанно. И что самое, приятное, наличем getter и setter неявно сообщил мне эту информацию. И я как, потенциальный пользователь класса, буду благодарен ему за это. Как и за ту дополнительную информацию, которую он предоставляет, не ленясь расставлять, где нужно const, throw и пр. Ведь в конечном счете спецификатор метода const(после того как метод реализован) тоже в основном служит для информативных целей, за исключением, когда его применение обусловно перегрузкой метода. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Вот кстати еще материл по пропертям в С++
Присоединённый файл ( Кол-во скачиваний: 22 )
Property.pdf 57,92 Kb-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
а тебе никто не запрещает использовать get/set. Просто когда их мало, то и проблемы нет. А все эти проперти придумывают, когда дизайн плохой, и куча голых данных, и к ним нужен контролируемый доступ. А один-два set/get и не проблема, и не сложность в написании. |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
да вот и тему то я поднял из-за того, что в классе есть пяток get/set. Очень засоряет код Добавлено @ 21:20 Vyacheslav, посмотрел код- вроде понятно. Непонятно почему у этих классов открыти копирующий конструктор и оператор присваивания ? |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
zss, а разве есть другие варианты? -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |