學習OCC的第一步是要瞭解其類的結構及組成,比如AIS_InteractiveObject類用來表示一個互動
式繪圖物件,如果進一步瞭解會發現其繼承關係是:MMgt_TShared->Standard_Transient-
>PrsMgr_PresentableObject->SelectMgr_SelectableObject->AIS_InteractiveObject
其實,許多類的基類都是MMgt_TShared
,另外,每個類都有一個對應的類,比如 ,對於Standard_Transient類來說,實際使用的是
Handle(Standard_Transient)類,不要被括弧搞混了,它只不過是個宏定義,也就是類
Handle_Standard_Transient.
那麼OCC為什麼這樣繞一圈子呢,原因是,在OCC中要避免使用指標,所謂“不使用”,只不過是
對它做一層封裝,讓使用者感覺不到使用指標,這層封裝就是Handle(類名)的作用。
那麼OCC為什麼對指標如此避諱呢?
當如果做圖形時,如果產生一個類,比如一個直線,如果直接用new的方法,那麼每產生一個就
佔用一片空間,這樣會佔用很多系統資源。同時降低效率。顯然,只是頂點位置不同的直線,如
果對它的顏色,線型等都重建,那產生一萬條直線機器肯定吃不消。
一個解決方案就是只拷貝建構函式產生直線,讓他不儲存資料,而只儲存一個指向原來直線資料
的指標。這樣空間就節省了很多。但問題在於這樣兩個直線完全連接在了一起。如果修改了其中
一個,另一個也跟著變了。同時如果刪除了第二個直線,第一個直線實際上資料也刪除了,成了
懸掛指標。
OCC中Handle的真正作用正是解決這個問題的。在Standard_Transient類中有一個私人變數:
Standard_Integer count;它用用計算引用數的,也就是說每產生一個直線,就增加一,每刪除
一條直線,就減一,除非count等於O了,才真正刪除Standard_Transient所佔用的空間。平時,
這幾條直線都共用顏色值,共用同一塊空間,直到更改其中一條線的顏色時,才真正分配此直線
的顏色值空間。
如果我的分析有不正確的地方,可以直接將磚頭扔到tongabcd@yeah.net ;