国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在C++中實(shí)現(xiàn)屬性

2019-11-17 05:28:54
字體:
供稿:網(wǎng)友
詳述
我們首先看一下什么是屬性。一個(gè)屬性表現(xiàn)為一個(gè)字段或者成員變量,但它通過read和write方法或者get和set方法暗中操作變量。 例如,若存在類A和它的屬性Count,我可以寫如下的代碼: A foo; Cout << foo.Count; 實(shí)際上Count調(diào)用它的get函數(shù)返回當(dāng)前的變量值。你可以將屬性定為只讀(你可以讀取它但不能修改它)、只寫或者可讀寫,這就是使用屬性而不直接使用變量的的一個(gè)最大好處了。好了,讓我們開始來實(shí)現(xiàn)它: 我們需要能做如下的事: int i = foo.Count; //--調(diào)用get函數(shù)得到值 foo.Count = i; //-- 調(diào)用set函數(shù)設(shè)定值 因此,很明顯的我們需要重載''=''操作符使其能設(shè)定變量的值,同時(shí)也要重載該屬性的返回值(在下面我們將會(huì)看到的)。 我們將實(shí)現(xiàn)一個(gè)稱為property的類,它做的就像一個(gè)屬性,聲明如下:template <typename Container, typename ValueType, int nPropType>class PRoperty {}這個(gè)模板類表示的是我們的屬性。Container是我們要在其中包含屬性的類變量,set和get方法以及屬性的類的類型。ValueType是內(nèi)部變量即要定義的屬性的類型,nPropType定義屬性的讀寫標(biāo)志:只讀、只寫或可讀寫。現(xiàn)在我們需要一個(gè)指向從包含屬性的類Container到屬性類property的set和get方法的指針,同時(shí)重載''=''操作符以使得屬性能象變量起那樣作用。現(xiàn)在我們來看property類的全部定義#define READ_ONLY 1#define WRITE_ONLY 2#define READ_WRITE 3template <typename Container, typename ValueType, int nPropType>class property{public:property(){ m_cObject = NULL; Set = NULL; Get = NULL;}//-- 將m_cObject指向包含屬性的container類 --void setContainer(Container* cObject){ m_cObject = cObject;}//-- 設(shè)定可改變屬性值的set成員函數(shù) --void setter(void (Container::*pSet)(ValueType value)){ if((nPropType == WRITE_ONLY) (nPropType == READ_WRITE)) Set = pSet; else Set = NULL;}//-- 設(shè)定可檢索屬性值的get成員函數(shù) --void getter(ValueType (Container::*pGet)()){ if((nPropType == READ_ONLY) (nPropType == READ_WRITE)) Get = pGet; else Get = NULL;}//-- 重載''=''號(hào)操作符使其能用set成員設(shè)定屬性值--ValueType operator =(const ValueType& value){ assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value;}//-- 使屬性類能轉(zhuǎn)換為內(nèi)部類型成為可能--operator ValueType(){ assert(m_cObject != NULL); assert(Get != NULL); return (m_cObject->*Get)();}private: Container* m_cObject; //-- 指向包含屬性的類模塊 -- void (Container::*Set)(ValueType value); //-- 指向set成員函數(shù)的函數(shù)指針 -- ValueType (Container::*Get)(); //-- 指向get成員函數(shù)的函數(shù)指針 --}; 現(xiàn)在讓我們來一段一段地看這些代碼:
在下面的代碼中,僅僅將Container指針指向一個(gè)有效的包含屬性的實(shí)例。void setContainer(Container* cObject){ m_cObject = cObject;}下面的代碼,設(shè)定指針指向包含屬性的類中的set和get成員函數(shù),其set和get成員函數(shù)度有,唯一的限制即set成員函數(shù)必須有一個(gè)ValueType型的參數(shù)并無返回值,get成員函數(shù)沒有參數(shù),但要返回ValueType型值。//-- 設(shè)定可改變屬性值的set成員函數(shù) --void setter(void (Container::*pSet)(ValueType value)){ if((nPropType == WRITE_ONLY) (nPropType == READ_WRITE)) Set = pSet; else Set = NULL;}//-- 設(shè)定可檢索屬性值的get成員函數(shù) --void getter(ValueType (Container::*pGet)()){ if((nPropType == READ_ONLY) (nPropType == READ_WRITE)) Get = pGet; else Get = NULL;}在如下的代碼中,第一部分是''=''操作符的重載,它調(diào)用包含屬性的類中的set函數(shù)設(shè)定其屬性的值。第二部分則為了使整個(gè)屬性類象ValueType類型一樣起作用,所以它返回包含屬性的類中g(shù)et函數(shù)的返回值。//-- 重載''=''號(hào)操作符使其能用set成員設(shè)定屬性值--ValueType operator =(const ValueType& value){ assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value;}//-- 使屬性類能轉(zhuǎn)換為內(nèi)部類型成為可能--operator ValueType(){ assert(m_cObject != NULL); assert(Get != NULL); return (m_cObject->*Get)();}
現(xiàn)在我們來看看怎樣使用它:
如下所示,在PropTest類中定義了一個(gè)叫做Count的簡單屬性。Count的實(shí)際值將保存到或檢索之在PropTest的私有成員變量"m_nCount"中,通過PropTest的get和set方法。get和set方法可以使用任何的變量名字,只需他們的地址能被傳遞到property類中,如下面的PropTest構(gòu)造函數(shù)里面的代碼般,代碼行" property<PropTest, int, READ_WRITE> Count; "讓我們?cè)赑ropTest中得到可讀寫的int型的Count屬性。現(xiàn)在你可以使用如一般的成員變量般使用使用Count屬性了,但實(shí)際上你是間接地調(diào)用它set和get方法。
要使Count屬性能成功工作,必須先在PropTest的構(gòu)造函數(shù)里面對(duì)其進(jìn)行初始化。 class PropTest{public: PropTest() { Count.setContainer(this); Count.setter(&PropTest::setCount); Count.getter(&PropTest::getCount); } int getCount() { return m_nCount; } void setCount(int nCount) { m_nCount = nCount; } property<PropTest,int,READ_WRITE> Count;private: int m_nCount;};如下所示,你可以象使用普通變量一樣使用Count屬性。int i = 5,j;PropTest test;test.Count = i; //-- 調(diào)用set函數(shù) --j= test.Count; //-- 調(diào)用get函數(shù) --要使用只讀的屬性,你可以創(chuàng)建如下的property實(shí)例:property<PropTest,int,READ_ONLY > Count;要使用只寫的屬性,你可以創(chuàng)建如下的property實(shí)例:property<PropTest,int,WRITE_ONLY > Count; 注重:假如你將某一屬性設(shè)為只讀,當(dāng)你對(duì)其賦值時(shí),將引發(fā)assertion診斷。同理,當(dāng)讀取只寫的屬性時(shí)
也同樣會(huì)引發(fā)assertion診斷。

小結(jié)
本文展示了在C++只用標(biāo)準(zhǔn)的C++特性而不使用其他任何的擴(kuò)展技術(shù)來實(shí)現(xiàn)屬性。當(dāng)然,直接使用set和get函數(shù)效率
要更高些,因?yàn)楸疚闹械姆椒ㄐ枰獮槊恳粋€(gè)屬性定義一個(gè)property類實(shí)例。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 房产| 双鸭山市| 宽甸| 甘孜| 棋牌| 泾川县| 揭阳市| 铜陵市| 黄平县| 图们市| 长寿区| 万源市| 长治市| 明溪县| 肇州县| 昆山市| 南平市| 阳曲县| 元江| 共和县| 宣恩县| 永嘉县| 馆陶县| 屏山县| 宁安市| 祁阳县| 洛南县| 泰来县| 新津县| 鄂托克前旗| 贵港市| 航空| 竹北市| 巴彦淖尔市| 岢岚县| 莱西市| 湖州市| 江北区| 辽宁省| 兴义市| 和龙市|