Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Использование property

#cpp


Люди помогите! Поясните, что это код делает?
__property int SizeX  = { read=FSizeX, write=SetSizeX };
__property int SizeY  = { read=FSizeY, write=SetSizeY }; 
__property int Vy  = { read=Fvy, write=SetVy };
    


Ответы

Ответ 1



На вопрос вам, в принципе, уже ответили, но попробую разъяснить некоторые подробности. Вообще говоря, __property - это некоторая попытка нарастить стандартные возможности C++ платформо-зависимым способом. Конкретно в C++ Builder следующие фрагменты кода будут эквивалентными (разве что в первом случае ответственность за генерацию геттеров / сеттеров переносится на компилятор). __property int SizeX = { read=FSizeX, write=SetSizeX }; public: void SetSizeX(int NewSizeX) { SizeX = NewSizeX; } int FSizeX() const { return SizeX; } private: int SizeX; У использования __property есть только одно обозримое преимущество, которое заключается в избавлении от необходимости писать boilerplate код для геттеров и сеттеров. Ну и, плюс, мы получаем некоторую структуризацию кода, когда все property-like члены класса оказываются в одном и том же месте. Недостатков же намного больше - в первую очередь, полная непереносимость такого кода на другие платформы. Сюда стоит добавить еще неочевидность генерации методов GetProperty в плане константности, отсутствие поддержки семантики переноса (&&) из стандарта C++0x, сложность написания нетривиальных геттеров и сеттеров, поддерживающих lazy-loading и т.д. Лично у меня, например, вопроса "использовать __property или нет" просто не возникает, поскольку недостатков, к сожалению, намного больше, нежели преимуществ. То же самое, кстати говоря, относится к платформо-специфичным вещам типа _CrtSetReportMode, которые, если и используются, то должны быть строго отделены ifdef'ами. P.S. Если еще немного порассуждать насчет __property, то аналогичное расширение существует в Microsoft C++/CLI. Но, в отличие от C++ Builder, там необходимость использования __property обусловлена нативной поддержкой свойств в C# (т.е разработчикам CLI Runtime просто необходимо было каким-то образом продублировать этот же механизм в биндинге для C++). P.P.S. Также отмечу, что проблема property-like членов класса и необходимости соответствующей конвенции хорошо решена в Google C++ Code Style, где четко определен способ оформления членов класса вида get_value().

Ответ 2



Это код именно на С++. Я сам писал такой многократно. Разработчик не дает возможности пользователю обращаться к полям Fx непосредственно: чтение поля - через свойство, а изменение его - через функцию SetX(). Поле и функция оформляются в классе как private, а property - как public.

Ответ 3



Этот код видимо не на C++. Но ясно что он объявляет два три поля и задаёт соответственно для каждого по get и set методу. Это из ООП (на случай, если вы не знаете, что такое property).

Комментариев нет:

Отправить комментарий