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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> свойства класса 
:(
    Опции темы
zss
Дата 27.12.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



иногда напрягает писать для класса методы устанавливающие и возвращающие значения
Как правило это значения простых типов. Не помню где (вроде на RSDN) в свое время нашел
пример класса-свойств (чтоб избавиться от get/set)

Код
template <class T, typename Owner>
class property {
private :
         property (const property&);
         property& operator = (const property&);

protected :
    typedef T (Owner::*fget)(void) const;
    typedef void (Owner::*fset) (T);
    Owner* m_owner;
    fget m_get;
    fset m_set;

public :
    property () : m_owner(NULL), m_get(NULL), m_set(NULL) {;}
    property (Owner* const owner,  fget get, fset set)
        : m_owner (owner), m_get(get), m_set (set) {;}

    void init (Owner* const owner,  fget get, fset set)
    {
        m_owner = owner;
        m_get = get;
        m_set = set;
    }
    operator T () const
    {
        return (m_owner->*m_get)();
    }
    void operator = (const T& data)
    {
        (m_owner->*m_set)(data);
    }
};


используется слудующим образом
Код
class C
{
private :
    int m_value;
    int get_value (void) const { return m_value; }
    void set_value (int v) { m_value = v; }

public :
    property <int, C> value;
    C()
    {
        value.init (this, &C::get_value, &C::set_value);
    }
    ~C() {;}
}


и тогда
Код
С с;
int k = c.value;
c.value = 100;


но возникает проблемма при копировании объекта, т.к. меняется this.
Поэтому этот класс закрыт от копировани. Но если классу С это необходимо, то приходится
руками прописывать копирующий конструктор и оператор присваивания.

Идея очень интересна. Да и в использовании удобна. Но только напрягают
трудозатраты. Можно ли как проще это сделать ?
PM MAIL ICQ   Вверх
Daevaorn
Дата 27.12.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Цитата(zss @  27.12.2006,  23:37 Найти цитируемый пост)
иногда напрягает писать для класса методы устанавливающие и возвращающие значения

но ты их всё равно написал у класса С, заначит property эту проблему не решает.
Цитата(zss @  27.12.2006,  23:37 Найти цитируемый пост)
Идея очень интересна. 

Да. но толку от неё мало.
Цитата(zss @  27.12.2006,  23:37 Найти цитируемый пост)
Да и в использовании удобна

очень маленькое и спорное удобство. плюс явный перерасход памяти. на один int(4 байта, например) лишних как минимум 12 байт.

Цитата(zss @  27.12.2006,  23:37 Найти цитируемый пост)
Можно ли как проще это сделать ? 

1-ый способ:
Код

С с;
int k = c.getValue();
c.setValue( 100 );

2-ой:
если у вас в классе много сеттеров/геттеров, явно стоит задуматься об улучшении дизайна.
PM MAIL WWW   Вверх
zss
Дата 28.12.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Daevaorn @  27.12.2006,  22:49 Найти цитируемый пост)
если у вас в классе много сеттеров/геттеров, явно стоит задуматься об улучшении дизайна. 

а что именно улучшать, если необходимо выставлять/читать значения
PM MAIL ICQ   Вверх
Daevaorn
Дата 28.12.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Цитата(zss @  28.12.2006,  10:19 Найти цитируемый пост)
а что именно улучшать, если необходимо выставлять/читать значения 

избавляться от такой необходимости.
http://forum.vingrad.ru/topic-103281/hl/%2...2580/index.html
PM MAIL WWW   Вверх
takedo
Дата 28.12.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



по моему, такие извращения со свойствами, описанными у тебя нежны лишь тогда, когда при изменении переменной тебе хочется автоматом выполнить и ещё какую - нибудь сопутствующую оперцию. Например, отобразить вновь введенное значение. То есть при использовании set ты не только приравняешь переменную нужному значению, но и сразу же её отобразишь.
А так лучше просто переопределять оператор равно:

Код

class C
{
 public:
C& operator&=(C& a){memcpy(&this,&a,sizeof(C));return *this;}
};

И больше ничего не надо. Иногда может понадобиться без ссылки, то есть C operator=(C a), тогда делаешь не через memcpy а как нибудь по другому и усё.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 28.12.2006, 12:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я лично, если в классе много простых значений свойств, делаю простую структуру и возвращаю\устанавливаю ее одним куском. Это если они логически связаны, скажем, параметры чего-нибудь. Согласитесь, глупо как-то на C++ возвращать\устанавливать, скажем, каждую координату прямоугольника отдельно. 


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


Эксперт
****


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

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



Цитата(Earnest @  28.12.2006,  12:22 Найти цитируемый пост)
Согласитесь, глупо как-то на C++ возвращать\устанавливать, скажем, каждую координату прямоугольника отдельно.  

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



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
zss
Дата 28.12.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Earnest @  28.12.2006,  12:22 Найти цитируемый пост)
Я лично, если в классе много простых значений свойств, делаю простую структуру и возвращаю\устанавливаю ее одним куском. Это если они логически связаны, скажем, параметры чего-нибудь. Согласитесь, глупо как-то на C++ возвращать\устанавливать, скажем, каждую координату прямоугольника отдельно.  

они никак не связаны smile


Цитата(takedo @  28.12.2006,  09:52 Найти цитируемый пост)
class C
{
 public:
C& operator&=(C& a){memcpy(&this,&a,sizeof©);return *this;}
};

ну тогда все данные будут меняться, а если мне нужно выборочно ?


Цитата(Daevaorn @  28.12.2006,  09:47 Найти цитируемый пост)
избавляться от такой необходимости.
http://forum.vingrad.ru/topic-103281/hl/%2...2580/index.html 

хм... довольно противоречивые мнения....
Если просто изменение данных, то лигично сделать их public. Но встает проблемма
с сопровождение. Не использовать их вообще ? так что - stl и boost не правильно спроектированы ?
И как возможно вообще избавиться ?
PM MAIL ICQ   Вверх
takedo
Дата 28.12.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Признаюсь честно, я делаю точно так же как и Earnest, пришел к этому со временем. А почему? Да потому, что при работе с кучей потоков так удобнее. smile  и логичнее. Да и просто правильнее, так как именно так делает Earnest smile  smile  smile 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
zss
Дата 28.12.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



кстати из ссылки Daevaorn, очень понравилось самое последнее сообщение smile
Если серьезно (и выбросить оттуда кучу прериканий), то объяснено очень доходчиво.

Но вот пример. Я разбираю потоки данны с сетевых адаптеров
и строю на основе этого иерархию. Я не всегда могу сразу определить некоторые данные
(например IP-адрес). Но впоследствии я могу это сделать.

Как мне изменить данные и потом получить их не используя get/set ?

P.S. Или например есть класс, отвечающий за сигнализацию. Она может быть 
отключена/включена. Как ее включить без set?

А в общем вывод понятен - ошибка реализации. Но я поверю окончательно, если
вы привидете мне убедительные ответы на мои вопросы smile
PM MAIL ICQ   Вверх
Vyacheslav
Дата 28.12.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



zss
Не  забивай голову.
Когда я вижу getter и  setter - это прежде всего для меня дополнительная информация о классе и .. программисте. То есть дав такой доступ, он мне неявно сообщил, что читать и записывать данные я могу в любое время и в любом порядке и следовательно, человек не просто принял решение от балды, а рассмотрел  все его последствия, и принял решение осознанно. И что самое, приятное, наличем   getter и  setter  неявно сообщил мне эту информацию.  
И я как, потенциальный пользователь класса,  буду благодарен ему за это. Как и за ту дополнительную информацию, которую он предоставляет, не ленясь  расставлять, где нужно const, throw и пр.  Ведь в конечном счете спецификатор метода const(после того как метод реализован) тоже в основном служит для информативных целей, за исключением, когда его  применение обусловно перегрузкой метода. 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 28.12.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот кстати еще материл по пропертям  в С++

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  Property.pdf 57,92 Kb


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 28.12.2006, 20:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Цитата(zss @  28.12.2006,  17:08 Найти цитируемый пост)
 не используя get/set ?

Цитата(zss @  28.12.2006,  17:08 Найти цитируемый пост)
Как ее включить без set?

а тебе никто не запрещает использовать get/set. Просто когда их мало, то и проблемы нет. А все эти проперти придумывают, когда дизайн плохой, и куча голых данных, и к ним нужен контролируемый доступ. А один-два set/get и не проблема, и не сложность в написании.
PM MAIL WWW   Вверх
zss
Дата 28.12.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Daevaorn @  28.12.2006,  20:41 Найти цитируемый пост)
а тебе никто не запрещает использовать get/set. Просто когда их мало, то и проблемы нет. А все эти проперти придумывают, когда дизайн плохой, и куча голых данных, и к ним нужен контролируемый доступ. А один-два set/get и не проблема, и не сложность в написании.

да вот и тему то я поднял из-за того, что в классе есть пяток get/set. Очень засоряет код smile

Добавлено @ 21:20 
Vyacheslav, посмотрел код- вроде понятно.

Непонятно почему у этих классов открыти копирующий конструктор и оператор присваивания ?
PM MAIL ICQ   Вверх
Rockie
Дата 29.12.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(zss @  28.12.2006,  21:12 Найти цитируемый пост)
Непонятно почему у этих классов открыти копирующий конструктор и оператор присваивания ?


zss, а разве есть другие варианты?




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


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

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