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

Комментарии

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

Siege Up! Editor (beta)

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

Git и Yandex.Disk