Аннотация:
В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.
А зачем нужны такие сложности... Вроде бы с помощью указателей превосходно получается...
/*.............*/
class A
{
int i;
public:
int get();{return i;}
int& put(); {reurn i;}
};
int main()
{
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Статья: ДМ>Свойства в С++
ДМ>Авторы: ДМ> Денис Майдыковский
ДМ>Аннотация: ДМ>В этой статье автор рассматривает различные способы реализации свойств в стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++, тогда как другие годятся для применения в любой программе, написанной на языке C++.
Помимо operator=, нужно еще много чего перегружать, например, инкременты
Но это мы оставим пытливому читателю в качестве упражнения
Отзовитесь пожалуйста. Неужели при таких недостатках:
//==================
При каждом обращении к "свойству" происходит два вызова функции.
Использование таких "свойств" требует дополнительных затрат памяти из-за того, что на каждое "свойство" требуется 3 дополнительных указателя, что составляет 12 байт накладных расходов.
Использование шаблонов приводит к увеличению размеров исполняемого кода, поскольку компилятор будет генерировать отдельный класс для каждой пары "proptype" и "propowner".
Для каждого "свойства" необходимо не забыть произвести инициализацию в конструкторе класса-владельца.
//==================
достоинства иногда побеждают? И какие достоинства вообще существуют кроме наглядности?
Re[2]: А реально кто ни будь использует ТАКИЕ свойства?
Здравствуйте, SergeyBi, Вы писали:
SB>Отзовитесь пожалуйста. Неужели при таких недостатках:
Ну во-первых, наглядность тоже неплохо. А во-вторых, вот реальная ситуация, когда пришлось
воспользоваться подобным механизмом.
В некотором классе была объявлена открытая переменная, которой присваивалось значение в различных местах
программы. Естественно, рано или поздно, "бомба взорвалась" и потребовалось производить некие дейсвия
при изменении этой переменной. Прежде чем "перелопачивать" всесь вызывающий код было эта переменная
была преобразована в "свойство", что позволило отладить логику самого класса, а уже позже, спокойно
обрабатывать вызовы.
Здравствуйте, Денис, Вы писали:
А>В некотором классе была объявлена открытая переменная, которой присваивалось значение в различных местах А>программы. Естественно, рано или поздно, "бомба взорвалась" и потребовалось производить некие дейсвия А>при изменении этой переменной. Прежде чем "перелопачивать" всесь вызывающий код было эта переменная А>была преобразована в "свойство", что позволило отладить логику самого класса, а уже позже, спокойно А>обрабатывать вызовы.
Здравствуйте, rounin, Вы писали:
R>get- и set-методы можно сделать аргументами шаблона. R>Тогда размер свойства уменьшится в 3раза. R>Хотя количество классов возрастёт
ну и пусть растет. все равно весь код — inline!
Serge.
Hасколько проще была бы жизнь, если бы она была в исходниках.
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)();