![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BreakPointMAN |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Доброе время суток всем!
Вообщем, дружан подкинул мне такую задачку... Представим, что у нас имеется класс:
Надеюсь, что затруднений особых он не вызовет. Вот, каким образом мы обращаемся к переменной data? Через функции доступа - getData и setData, т.е. примерно так:
или так:
Товарищу моему такой вариант не слишком понравился... Говорит, что не наглядно и не слишком красиво... Хотелось бы видеть что-то вроде:
Ну, говорю, тогда помести переменную data в public:-секцию и не мучайся!.. Но тут возникает одно НО: нужен контроль за тем, что присваивается нашей переменной... Ну, если мы используем функцию доступа, то все просто:
Тут f - это функция, принимающая int и возвращающая bool, а в функции может быть записано какое-то условие, ну, например,
Разрешит изменение переменной data только в том случае, если мы захотим присвоить ей четное число; если число будет нечетным - то переменная меняться не должна. Вопрос в том, как сделать это, чтобы синтаксис работы с классом был такой: A a; a.data=10; // переменная изменится и станет равной 10 a.data=-7; // переменная не изменится, и останется равной 10 ??? Добавлено @ 07:42 Помучавшись немного, я пришел к следующему варианту... НО УСПОКОЙТЕ МЕНЯ - Я ИЗВРАЩЕНЕЦ ИЛИ НЕТ?! %)) Или можно проще?!
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||||||||||
|
|||||||||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В общем, все примерно так и делается, когда нужно обеспечить контроль за внутренними переменными, прозрачный для клиентского кода. Если не ощибаюсь, это паттерн "прокси".
Однако конкретный случай тем не менее является извращением: нельзя так грубо менять семантику оператора присваивания. Когда программист видит в коде выражение a = b, то он имеет право предполагать, что либо присваивание произойдет, либо будет исключение. А тут - либо присвоит, либо нет ... Такого рода действия нужно прямо выражать в коде, и не оператором, а функцией с "говорящим" названием типа TryToAssign. А ваш случай аналогичен переопределению оператора 'плюс' причем в смысле 'через раз поделим на 2'. -------------------- ... |
|||
|
||||
| Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
Property в C++:
взято отсюда -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
ммм... наверное, только, не "прокси", а "property"... %) мде... вообщем, я изобрел велосипед! %))) Ну ничего, зато интересно было...
Вообще говоря, да, я согласен. Но здесь функция f у него, насколько я понял, просто будет обеспечивать верификацию корректности задания значения св-ва, т.е. чтобы, например, число лежало в определенных границах и т.п. И ничего более... так что... в принципе... с натяжкой... думаю, что можно допустить этот вариант. 2 Alastis: спасибо за ссылку! -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
BreakPointMAN
Да, существует точка зрения, что иногда на красный свет идти можно (если никого нет и т.д.). Но в вопросах программирования я категорически против такой "избирательности". Проффесиональный программист от любителя отличается не только хорошим знанием языка, но и тем, что твердо знает: программы пишутся для людей, а не для компиляторов. Программиста из моей группы я бы за такой изыск просто убила, ей-богу. Насчет того, как называется паттерн - не помню, может и property... я имела ввиду паттерны от "банды четырех". -------------------- ... |
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Несмотря на то, что уже есть инфа о том, что есть паттерн "свойство", и как это дело реализовано в MS VC и BCB, ... я продолжил изобретение велосипеда... извращенец я всё-таки... мде...
- вынес все в отдельный класс - добавил параметризацию, сделав класс шаблонным - добавил специализацию для типа char* - ввел в интерфейс класса функтор - указатель на функцию проверки условия, должно присваиваться или нет... в принципе, если условиям r-value не подходит, можно выбрасывать исключение - так вроде правильнее будет... Короче, хз, что получилось, ... обычный класс-контейнер, по сути... Бред... но всё же выложу... уууух, и багов тут наверное!!! (хотя вроде проверял, работать должно)
Добавлено @ 21:56 Юзается примерно так:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
PS: для стандартных типов типа char, int, float, double, а также char* должно работать без проблем... а для остальных - надо чтобы в классах, которые типом будут, были корректно определены конструкторы (по умолчанию и копирования), операция присваивания и деструктор.
Добавлено @ 22:07
а то была, вообще, не моя идея... )) меня спросили - как сделать можно... ну и заинтересовало... good, что это pattern такой есть, good, что уже давно написан, проверен и отлажен и под BCB, и под MSVC, потыркаться все равно прикольно было. вот... ) -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Кстати, народ, может посоветуете что-нибудь по паттернам почитать, кто знает?
Хотелось бы побольше про всякие фишки узнать... Монотипы, синглетоны... бррр... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Что-то не помню я такого паттерна "property".
-------------------- Волны гасят ветер... |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Например здесь Добавлено @ 22:49 Хотя property и не относится к шаблонам проекитрования. -------------------- Волны гасят ветер... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
2Fantasist & Vyacheslav: спасибо!
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
К сожалению, ничего нового не увидел. Что мне не нравится присутвует и здесь - надо передавать тип класса в котором эта проперти используется для каждой проперти. Это сообщение отредактировал(а) Fantasist - 7.7.2005, 00:17 -------------------- Волны гасят ветер... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Как это так? Там кажется есть соглашение. Для определения проперти XXX нужно определить хотя бы один из методов getXXX и setXXX -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
А почему property не вносят в стандарт языка?? Ведь в Borland-e вполне себе работает. И синтаксис очень красивый.
Или оно порождает некие глюки, простым смертным не видные?? Или не согласуется с концепцией какой-нить?? |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Попробуй в борланде прописать что-нить типа Width=Height=640. Он тебе по рукам даст. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
И правильно сделает. Нельзя мне позволять так писать.
|
|||
|
||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Это еще почему? Гораздо легче написать вместо
написать
Но с боралндовскими проперти так низзя Это сообщение отредактировал(а) Mayk - 12.7.2005, 12:49 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Мда. Мне-то такие выкруты не нравятся. Но их запрет говорит о том, что как с обычным оператором "=", там с property не поработешь. Зяль. Придется перегружать "=" и дальше.
ЗЫ. (я в борланде писал давно, тогда не замечал). |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Кстати, это всё издержи языка. С точки зрения разработчика компилятора я не вижу трудностей в создании access-функций к переменным, замаскированных под эти же переменные. Или как перегруженый оператор просто...
|
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Все это красиво, но, мутаторы вызываются либо без this (static метод) либо каждый property должен хранить указатель родителя. А это соответственно, недостаток либо не целесообразно.
Это сообщение отредактировал(а) Ivan. - 5.9.2007, 09:39 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
В Builder МОЖНО писать Width = Height = 0, если написать нормально property
Это сообщение отредактировал(а) Ivan. - 5.9.2007, 09:45 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Некрофилы
По сабжу я согласен с Earnest: ППКС. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Я "решил" более красивый, правдо не совсем рабочий, выриант. Помогите довести его до ума.
Приимущества такой реализации: - вызов мутаторов с this-ом равным объекту хозяина; - отсутствие дополнительных переменных (типа указателя на Object); - отсутствие конструкторов, диструкторов; - кратчайший код выполнения, решаемый еще на этапе компиляции; - мозможность наследия класса хозяина от базового (тоесть класс T может не являтся суперклассом); - доступ к полю из класса хозяина (FVal). Недостатки: - не совсем красивая инициализация; - грязноватый хак в плане взятия адреса хозяина ( (TObj*)((char*)this - OffSet) ); Ошибки: - строка TProperty<T, int, &GetVal, &SetVal, (int)&((T*)NULL)->Val> Val; ругается на то, что поле Val еще не определено. Помогите решить эту ошибочку ^^^ -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |