C++ свойства класса
Иногда, приходится описывать много свойств класса в C++. И по причине отсутствия в языке прямой поддержки свойств, для каждой переменной приходится писать нечто вроде:
Что не очень удобно, когда количество свойств превышает 5 штук. Очевидным решением проблемы является составление макросов для требуемых свойств. К сожалению, при ближайшем рассмотрении оказывается, что в качестве параметра макроса нельзя передать имя поля, например:
protected: inline int getValue() const {return value;} inline void setValue(int value) {this->value = value;} private: int value;
Что не очень удобно, когда количество свойств превышает 5 штук. Очевидным решением проблемы является составление макросов для требуемых свойств. К сожалению, при ближайшем рассмотрении оказывается, что в качестве параметра макроса нельзя передать имя поля, например:
#define PROPERTY(name, type) \ private: \ type name; \ public: \ inline type get ## name() {return name;} PROPERTY(test,int) //or PROPERTY(Test,int)При использовании такого макроса, мы получим объявление переменной с именем test и функцию gettest, либо переменную Test и функцию getTest. И то и другое стилистически не правильно, потому решением будет добавить к переменной префикс "m", что соответствует стандарту, и означает, что переменная принадлежит классу. В результате, у меня получился такой код:
#define PROPERTY_SET (name, type, scope) \ private: type m ## name;\ scope: inline void set ## name(type aValue) {m ## name = aValue;}\ #define PROPERTY_GET (name, type, scope) \ private: type m ## name;\ scope: inline type get ## name() const {return m ## name;}\ #define PROPERTY(name,type,scope) \ private: type m ## name;\ scope: inline type get ## name() const {return m ## name;}\ scope: inline void set ## name(type aValue) {m ## name = aValue;}\ #define PROPERTY_GET_SET(name,type,scope_get,scope_set) \ private: type m ## name;\ scope_get: inline type get ## name() const {return m ## name;}\ scope_set: inline void set ## name(type aValue) {m ## name = aValue;}\ //... class Transaction { PROPERTY(ReqData, JSONNode, protected) PROPERTY(RespData, JSONNode, protected) PROPERTY(ResultMsg, std::string, protected) PROPERTY(ResultN, int, protected) PROPERTY_GET_SET(UserId,unsigned int, public, protected) PROPERTY_GET_SET(AuthKey,std::string, public, protected) PROPERTY_GET_SET(Id,unsigned int, public, protected) PROPERTY_GET_SET(Type,unsigned int, public, protected) public: Transaction(); //... }
Комментарии
Отправить комментарий