對於c#而言,一個類可以有成員變量、成員函數、和屬性,然而在C++中卻沒有“屬 性”這一概念。為了達到相同的效果,在C++中一般是采用get_XXX()和set_XXX()兩個 函數來實現外部對成員變量的訪問。這樣做的弊端很明顯,類的聲明中多了很多冗余的代碼 :
private:
int m_data;
public:
int get_data() const;
int set_data(int value);
為了定義一個data屬性,需要寫很多代碼,事實上,我們想把上述代碼編程一句,那麼, 這個宏就可以實現:
#define AUTO_PROPERTY(type, name) \
private: type m_##name; \
public: type get_##name() const {return m_##name;} \
public: type set_##name(const type &value) \
{return m_##name, m_##name = value;}
然後我們就可以簡化代碼,增加可讀性:
class class1
{
AUTO_PROPERTY(int, data)
};
這樣,就實現了為class1增加一個名為data的屬性,同時提供了基本的訪問控制函數 get_data()和set_data()。當然這個宏能做到的僅僅是簡化代碼和增加可讀性,並未提供一 種全新的“屬性”模式。如果想自定義get_data()或set_data()函數,這個宏就 不夠用了,所以,我再給出下面幾個宏,可以達到自定義get,set函數的效果:
#define PROPERTY(type, name) \
private: type m_##name; \
public: type get_##name() const; \
public: type set_##name(const type &value);
#define PROPERTY_GET(classname, type, name) \
type classname::get_##name() const
#define PROPERTY_SET(classname, type, name) \
type classname::set_##name(const type &value)
使用舉例:
class myclass
{
public:
PROPERTY(int, data)
};
PROPERTY_GET(myclass, int, data)
{
return m_data;
}
PROPERTY_SET(myclass, int, data)
{
return m_data = value;
}
當然,這只是我提供的一種簡便方法,拋磚引玉而已,歡迎指教。