C++屬性的實現

在其他語言中, 例如 C#或者 objective-c 中,均有屬性這語法.
下面就實現這語法功能.

思索

通常來說,一個屬性由 getter 和 setter 來進行讀和寫.其普通形式如下:<pre>void set_name(T val); T get_name();</pre> 我們定義一個宏:<pre>#define property(T, name) T get_##name(); void set_##name(T val)</pre> 實現了定義2個方法,來控制讀取.
可是這是2個函數啊.依然不像 C#一樣可以通過一個對象值來讀寫啊!
對象值,要怎么實現? 對象, 對象,即這是一個類 class!
類定義變量名,每個變量名稱不一樣,代表著不同的屬性名!
可問題又來了,不同屬性類型不一樣啊!
類型不一樣, C++ 就有專治這問題的解決方案! 模板!

屬性類模板

<pre>template<typename ClassName, typename T>
class PropertyClass{
public:
typedef T(ClassName::*GetterType)();
typedef void (ClassName::*SetterType)(T val);
private:
ClassName* obj;
GetterType getter;
SetterType setter;
public:
explicit PropertyClass(ClassName* o, GetterType g, SetterType s) : obj(o), getter(g), setter(s){}
operator T(){return (obj->*getter)();}
PropertyClass& operator=(T val) { (obj->*setter)(val); return *this;}
};</pre>

宏:

<pre>#define property(C, T, N) PropertyClass<C, T> N; T get_##N(); void set_##N(T val)

define set_property(C, N) N(this, &C::get_##N, &C::set_##N)</pre>

用法

<code>class A
{
int _age;
public:
property(A, int, age);
A();
};
A::A() : set_property(A, age){}
int A::get_age() { return _age; }
void A::set_age(int a) { _age = a; }</code>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 成長的名字叫責任,因為有要保護的人,所以不想逃避,想要直面困難,變得更強更好。 成長的名字叫媽媽,...
    lambe12閱讀 188評論 0 0
  • 荷蘭的阿姆斯特丹是我們第二次歐洲行的第一站,史基浦機場乘車十幾分就能到達。 城市不大,可以用雙腳丈量。只是因為航班...
    用心生活用字記錄閱讀 491評論 4 4
  • 早上五點多自然醒 翻來覆去還是睡不著 起床去教室背單詞 下宿舍樓時 打掃衛(wèi)生的阿姨蜷坐在全身鏡旁的地上 手里拿了一...
    大大大大大臉貓閱讀 171評論 0 0
  • Spring WebSocket: Handshake failed due to invalid Upgrade...
    AmeeLove閱讀 6,779評論 0 0

友情鏈接更多精彩內容