C++ свойства класса

Иногда, приходится описывать много свойств класса в C++. И по причине отсутствия в языке прямой поддержки свойств, для каждой переменной приходится писать нечто вроде:

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();
    //...
}

Комментарии

  1. There are massive number} of types of steels for all fingerprint door lock waterproof kinds of purposes, such as stainless steel, carbon steel, and galvanized steel, but the metallic as a whole is thought for its sturdiness and energy. Lower-carbon content steel could also be} found in railings or fences, while medium carbon content steel is used for cars and appliances. The highest carbon content sheet metallic is incessantly present in steel wires. Stainless steel is used for cookware, medical instruments, and many of|and plenty of} different products.

    ОтветитьУдалить

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

Популярные сообщения из этого блога

Siege Up! Editor (beta)

Git и Yandex.Disk

STM32F4 и программный выход в DFU