Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Ada最终确定调整程序-在这里放什么?_Oop_Object_Ada - Fatal编程技术网

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方法内每个指针的值,并在必要时创建/释放内部对象