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