2011-08-19 51 views
3

鑑於以下聲明:Ada Finalization調整程序 - 該放什麼?

type Food_T is abstract tagged null record; 
    type Food_Ptr is access all Food_T'Class; 

    type Wrapper_T is new Ada.Finalization.Controlled with record 
     Ptr : Food_Ptr; 
    end record; 

    procedure Adjust (Object : in out Wrapper_T) is 
    begin 
     null; -- what goes here ? 
    end Adjust; 

我想知道如何分配&分配(深層副本)的food_噸正確derivitive時,我不知道Object.ptr將指向什麼類型(何源&目標是!)。

任何幫助,將不勝感激。

謝謝,

NWS。

回答

4

我想你的意思:

procedure Adjust (Object : in out Wrapper_T) is 
begin 
    Object.Ptr := new Food_T'Class'(Object.Ptr.all); 
end Adjust; 

然後,它的Object.Ptr.all的工作,以確保它是一個真正的深層副本,當然。 (爲此,Object.Ptr.all的類型可能想要派生Ada.Finalization.Controlled。爲了做到這一點,您可能希望使Food_T成爲interface,這樣Food_T派生類型也可以從Ada.Finalization.Controlled派生出來。)

+0

@Chris,這似乎是工作。謝謝。 NWS。 – NWS

-2

比方說你有兩個實例,A和B,訪問類型T的調整,當你做B方法,然後調用:= A.

但使用這種方法時要小心,因爲如果使用不當,它可能會造成內存泄漏!如果你的想法是B來保存對象A的全新引用,那麼將它留空。在這種情況下,B內的每個指針將指向內存中與A內的指針相同的位置。

如果要執行值類型賦值,也就是說,如果希望對象有相同的「數據」,但在不同的存儲位置,所以如果你改變了A,那麼B就不會注意到它。在這種情況下,您可以手動分配Adjust方法內的每個指針的值,並根據需要創建/釋放內部對象。