2013-03-31 95 views
6

在我的遊戲引擎的所有權,有三大類:EntityCharacterEntityVehicleEntityVehicleSeatC++ - 代表通過指針

enter image description here

EntityVehicle包含指針EntityCharacter的實例座對象。如果座位對象的目標字符實體指針是一個空指針,沒有字符坐在特定座位的對象。 EntityCharacter級的情況下,也紛紛指針座位的對象,這表明,這些字符實體是否坐在一些車輛或沒有。

換句話說,EntityCharacter類實例的指針指向EntityVehicleSeat和周圍的其他方法:

EntityCharacter -> EntityVehicleSeat 
EntityCharacter <- EntityVehicleSeat 

這樣我們就可以通過檢查文字與車輛實體所有權。

這將是簡單的設置指針指向對方,但有一個問題 - 如果其他對象超出範圍,我們最終不得不在餘下的對象無效指針。

enter image description here

怎麼能代表這種所有權sophisticatedly的?另一個對象如何被告知另一個對象不再存在的事實?

+0

使用的通知。 – Yousf

+0

你可以使用析構函數來通知其他對象? –

+0

這只是1:1的關係嗎? – Potatoswatter

回答

4

管理對象到對象的關係,包括雙向的,就是析構函數變得有用。您可以消除懸擺指針的問題是這樣的:

~EntityCharacter() { 
    // Do some other cleanup... 
    ... 
    if (seatPtr) { 
     assert(seatPtr->characterPtr == this); // That's my seat! 
     seatPtr->characterPtr = NULL; 
    } 
} 

~ EntityVehicleSeat() { 
    // Do some other cleanup... 
    ... 
    if (characterPtr) { 
     assert(characterPtr->seatPtr == this); // That's my character! 
     characterPtr->seatPtr = NULL; 
    } 
} 

一個問題,這種做法是併發性:如果一個座位和一個角色可以從不同的線程同時被刪除,你將需要同步刪除。在析構函數

+0

這麼簡單,但非常方便。非常感謝! – Helixirr