Oop Ada最终确定调整程序-在这里放什么?
鉴于下列声明:Oop Ada最终确定调整程序-在这里放什么?,oop,object,ada,Oop,Object,Ada,鉴于下列声明: 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
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的正确派生词
任何帮助都将不胜感激
谢谢
我想你的意思是:
procedure Adjust (Object : in out Wrapper_T) is
begin
Object.Ptr := new Food_T'Class'(Object.Ptr.all);
end Adjust;
然后是Object.Ptr。当然,所有的工作都是确保它确实是一个深度拷贝。
(要做到这一点,Object.Ptr.all的类型可能需要派生Ada.Finalization.Controlled。要做到这一点,您可能需要将Food\u T设置为一个,这样一个Food\u T派生类型也可以派生自Ada.Finalization.Controlled。)假设您有两个访问类型T的实例a和B。执行B:=a时,将调用Adjust方法
但在使用这种方法时要小心,因为如果使用不当,可能会造成内存泄漏!如果您的想法是B保存对对象a的全新引用,则将其留空。在这种情况下,B中的每个指针将指向内存中与A中指针相同的位置
如果您想要执行值类型赋值,也就是说,当您想要对象具有相同的“数据”但位于不同的内存位置时,只需完成该方法,这样,如果您更改了A,那么B将不会注意到它。在这种情况下,可以手动指定Adjust方法内每个指针的值,并在必要时创建/释放内部对象