學(xué)習(xí)OCC的第一步是要了解其類的結(jié)構(gòu)及組成,比如AIS_InteractiveObject類用來(lái)表示一個(gè)交互 式圖形對(duì)象,如果進(jìn)一步了解會(huì)發(fā)現(xiàn)其繼承關(guān)系是:MMgt_TShared->Standard_Transient->PrsMgr_PresentableObject->SelectMgr_SelectableObject->AIS_InteractiveObject。
其實(shí),許多類的基類都是MMgt_TShared,另外,每個(gè)類都有一個(gè)對(duì)應(yīng)的類,比如 ,對(duì)于Standard_Transient類來(lái)說(shuō),實(shí)際使用的是Handle(Standard_Transient)類,不要被括號(hào)搞混了,它只不過(guò)是個(gè)宏定義,也就是類Handle_Standard_Transient.那么OCC為什么這樣繞一圈子呢,原因是,在OCC中要避免使用指針,所謂“不使用”,只不過(guò)是對(duì)它做一層包裝,讓用戶感覺(jué)不到使用指針,這層包裝就是Handle(類名)的作用。
那么OCC為什么對(duì)指針如此避諱呢?
當(dāng)如果做圖形時(shí),如果生成一個(gè)類,比如一個(gè)直線,如果直接用new的方法,那么每生成一個(gè)就占用一片空間,這樣會(huì)占用很多系統(tǒng)資源。同時(shí)降低效率。顯然,只是頂點(diǎn)位置不同的直線,如果對(duì)它的顏色,線型等都重新生成,那生成一萬(wàn)條直線機(jī)器肯定吃不消。一個(gè)解決方法就是只拷貝構(gòu)造函數(shù)生成直線,讓他不存儲(chǔ)數(shù)據(jù),而只存儲(chǔ)一個(gè)指向原來(lái)直線數(shù)據(jù)的指針。這樣空間就節(jié)省了很多。但問(wèn)題在于這樣兩個(gè)直線完全聯(lián)結(jié)在了一起。如果修改了其中一個(gè),另一個(gè)也跟著變了。同時(shí)如果刪除了第二個(gè)直線,第一個(gè)直線實(shí)際上數(shù)據(jù)也刪除了,成了懸掛指針。
OCC中Handle的真正作用正是解決這個(gè)問(wèn)題的。在Standard_Transient類中有一個(gè)私有變量:Standard_Integer count;它用用計(jì)算引用數(shù)的,也就是說(shuō)每生成一個(gè)直線,就增加一,每刪除一條直線,就減一,除非count等于O了,才真正刪除Standard_Transient所占用的空間。考試,大提示這幾條直線都共用顏色值,共用同一塊空間,直到更改其中一條線的顏色時(shí),才真正分配此直線的顏色值空間。
其實(shí),許多類的基類都是MMgt_TShared,另外,每個(gè)類都有一個(gè)對(duì)應(yīng)的類,比如 ,對(duì)于Standard_Transient類來(lái)說(shuō),實(shí)際使用的是Handle(Standard_Transient)類,不要被括號(hào)搞混了,它只不過(guò)是個(gè)宏定義,也就是類Handle_Standard_Transient.那么OCC為什么這樣繞一圈子呢,原因是,在OCC中要避免使用指針,所謂“不使用”,只不過(guò)是對(duì)它做一層包裝,讓用戶感覺(jué)不到使用指針,這層包裝就是Handle(類名)的作用。
那么OCC為什么對(duì)指針如此避諱呢?
當(dāng)如果做圖形時(shí),如果生成一個(gè)類,比如一個(gè)直線,如果直接用new的方法,那么每生成一個(gè)就占用一片空間,這樣會(huì)占用很多系統(tǒng)資源。同時(shí)降低效率。顯然,只是頂點(diǎn)位置不同的直線,如果對(duì)它的顏色,線型等都重新生成,那生成一萬(wàn)條直線機(jī)器肯定吃不消。一個(gè)解決方法就是只拷貝構(gòu)造函數(shù)生成直線,讓他不存儲(chǔ)數(shù)據(jù),而只存儲(chǔ)一個(gè)指向原來(lái)直線數(shù)據(jù)的指針。這樣空間就節(jié)省了很多。但問(wèn)題在于這樣兩個(gè)直線完全聯(lián)結(jié)在了一起。如果修改了其中一個(gè),另一個(gè)也跟著變了。同時(shí)如果刪除了第二個(gè)直線,第一個(gè)直線實(shí)際上數(shù)據(jù)也刪除了,成了懸掛指針。
OCC中Handle的真正作用正是解決這個(gè)問(wèn)題的。在Standard_Transient類中有一個(gè)私有變量:Standard_Integer count;它用用計(jì)算引用數(shù)的,也就是說(shuō)每生成一個(gè)直線,就增加一,每刪除一條直線,就減一,除非count等于O了,才真正刪除Standard_Transient所占用的空間。考試,大提示這幾條直線都共用顏色值,共用同一塊空間,直到更改其中一條線的顏色時(shí),才真正分配此直線的顏色值空間。