Свойства в С++
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 20.11.01 00:25
Оценка: 525 (20)
Статья:
Свойства в С++
Автор(ы): Денис Майдыковский

В этой статье автор рассматривает различные способы реализации свойств в
стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++,
тогда как другие годятся для применения в любой программе, написанной на
языке C++.


Авторы:
Денис Майдыковский

Аннотация:
В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.
А как же ссылки?
От: null  
Дата: 16.09.02 17:29
Оценка:
А зачем нужны такие сложности... Вроде бы с помощью указателей превосходно получается...
/*.............*/
class A
{
int i;
public:
int get();{return i;}
int& put(); {reurn i;}
};
int main()
{

A x;

x.put()=1;

}
/*..............*/
Разделение по способам доступа
От: KA it-knowledge-base.blogspot.com
Дата: 26.04.02 07:17
Оценка:
Было бы лучше ввести разные шаблоны для свойств только для чтения, только для записи, ...
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
мысль
От: rounin  
Дата: 29.01.02 02:50
Оценка:
get- и set-методы можно сделать аргументами шаблона.
Тогда размер свойства уменьшится в 3раза.
Хотя количество классов возрастёт :(

template <typename proptype, typename propowner,
proptype (propowner::*getmethod)(),
void (propowner::*setmethod)(proptype)>
class property {...};

...
property<int, CValue, &get_Value, &put_Value> Value;
?
От: neXt  
Дата: 28.11.01 04:31
Оценка:
а как тогда реализуется свойства с параметром
вроде List->Items[1] = ...
Достойно
От: neXt  
Дата: 22.11.01 03:03
Оценка:
Очень интересная статья!
От: boombastik  
Дата: 21.11.01 00:25
Оценка:
Мое почтение!
С уважением, Владимир
Re: А как же ссылки?
От: Aquary Россия https://wmspanel.com/
Дата: 01.10.02 02:10
Оценка:
Тогда не проще ли вообще сделать public int i?
https://wmspanel.com/nimble — Nimble Streamer media server for live and VOD HLS, RTMP, HTTP streaming
https://wmspanel.com/ — Control and reporting panel for Wowza and Nimble Streamer
http://scm-notes.blogspot.com/ — Блог об управлении конфигурацией
Re: ?
От: RailRoader Украина  
Дата: 26.02.02 10:31
Оценка:
Перегрузить оператор [].
А также можно *, ->, () и получить кучу фантастических вещей :)
Re: ?
От: Аноним  
Дата: 07.07.03 13:22
Оценка: -1 :)
Здравствуйте, neXt, Вы писали:

X>а как тогда реализуется свойства с параметром

X>вроде List->Items[1] = ...

Дык объяви массив свойств
Re: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 07.07.03 14:36
Оценка:
Здравствуйте, Денис Майдыковский, Вы писали:

ДМ>Статья:

ДМ>Свойства в С++

ДМ>Авторы:

ДМ> Денис Майдыковский

ДМ>Аннотация:

ДМ>В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.


Помимо operator=, нужно еще много чего перегружать, например, инкременты

Но это мы оставим пытливому читателю в качестве упражнения
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: А реально кто ни будь использует ТАКИЕ свойства?
От: SergeyBi  
Дата: 07.07.03 17:15
Оценка:
Отзовитесь пожалуйста. Неужели при таких недостатках:

//==================
При каждом обращении к "свойству" происходит два вызова функции.

Использование таких "свойств" требует дополнительных затрат памяти из-за того, что на каждое "свойство" требуется 3 дополнительных указателя, что составляет 12 байт накладных расходов.

Использование шаблонов приводит к увеличению размеров исполняемого кода, поскольку компилятор будет генерировать отдельный класс для каждой пары "proptype" и "propowner".

Для каждого "свойства" необходимо не забыть произвести инициализацию в конструкторе класса-владельца.

//==================

достоинства иногда побеждают? И какие достоинства вообще существуют кроме наглядности?
Re[2]: А реально кто ни будь использует ТАКИЕ свойства?
От: Аноним  
Дата: 08.07.03 05:40
Оценка: +2
Здравствуйте, SergeyBi, Вы писали:

SB>Отзовитесь пожалуйста. Неужели при таких недостатках:


Ну во-первых, наглядность тоже неплохо. А во-вторых, вот реальная ситуация, когда пришлось
воспользоваться подобным механизмом.

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

Денис
Re[3]: тогда такой вопрос...
От: SergeyBi  
Дата: 08.07.03 06:11
Оценка:
Используете ли Вы такие свойства ТОЛЬКО ради наглядности?
Re[4]: тогда такой вопрос...
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 08.07.03 06:19
Оценка:
Здравствуйте, SergeyBi, Вы писали:

SB>Используете ли Вы такие свойства ТОЛЬКО ради наглядности?


В реальных проектах нет.
А на этапе обучения вполне можно, особенно для тех кто с VB переползает.
Re[2]: А реально кто ни будь использует ТАКИЕ свойства?
От: Awaken Украина  
Дата: 08.07.03 09:35
Оценка:
SB>достоинства иногда побеждают? И какие достоинства вообще существуют кроме наглядности?

бывает нужно разделить операцию присваивания для левого и правого оператора на 2 разных
метода.
Re[3]: А реально кто ни будь использует ТАКИЕ свойства?
От: jazzer Россия Skype: enerjazzer
Дата: 08.07.03 10:13
Оценка:
Здравствуйте, Денис, Вы писали:

А>В некотором классе была объявлена открытая переменная, которой присваивалось значение в различных местах

А>программы. Естественно, рано или поздно, "бомба взорвалась" и потребовалось производить некие дейсвия
А>при изменении этой переменной. Прежде чем "перелопачивать" всесь вызывающий код было эта переменная
А>была преобразована в "свойство", что позволило отладить логику самого класса, а уже позже, спокойно
А>обрабатывать вызовы.

хотя лучше purify для этого использовать
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: мысль
От: Sergeem Израиль  
Дата: 08.07.03 10:39
Оценка:
Здравствуйте, rounin, Вы писали:

R>get- и set-методы можно сделать аргументами шаблона.

R>Тогда размер свойства уменьшится в 3раза.
R>Хотя количество классов возрастёт

ну и пусть растет. все равно весь код — inline!
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
Re: вот как делал я..
От: PK Sly http://www.vocord.ru/
Дата: 22.03.04 10:37
Оценка:
#define PROPERTY(OWNERNAME, TYPE, NAME, FNGET, FNPUT) \
struct propclass_##NAME { \
    inline operator TYPE() { \
        CONTAINING_RECORD(this, OWNERNAME, NAME)->FNGET(); \
    } \
    inline void operator=(TYPE src) { \
        CONTAINING_RECORD(this, OWNERNAME, NAME)->FNPUT(src); \
    } \
} NAME;

#define PROPERTY_DEF(OWNERNAME, TYPE, NAME) \
    PROPERTY(OWNERNAME, TYPE, NAME, Get_##NAME, Put_##NAME)

использование этого:
    class C
    {
    public:
        int Get_i() { cout << "Get = 1" << endl; return 1; }
        void Put_i(int n) { cout << "Put(" << n << ')' << endl; }
        PROPERTY_DEF(C, int, i);
    };

    C c;
    cout << c.i << endl;
    c.i = 1;

Понятно, что для нормальной работы надо ещё добавить все возможные операторы (типа ++, += и т.д.) и сделать дополнительно обёртку для классов с оператором -> и т.п.

Наверняка кто-то скажет про нехорошесть использования макросов вообще, а особенно CONTAINING_RECORD... но посмотрите окончание статьи, где описаны недостатки. Ни одного из тех недостатков тут нет. что и требовалось...
VAX/VMS rulez!
Re: Свойства в С++
От: Аноним  
Дата: 22.03.04 11:59
Оценка:
Здравствуйте, Денис Майдыковский, Вы писали:

ДМ>Статья:



ДМ>Авторы:

ДМ> Денис Майдыковский

ДМ>Аннотация:

ДМ>В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.

Не пойму смысл данной конструкции. Объясните что это
typedef proptype (propowner::*getter)();
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.