gpt4 book ai didi

package - Ada:理解私有(private)类型和理解包装

转载 作者:行者123 更新时间:2023-12-04 03:06:40 24 4
gpt4 key购买 nike

我正在尝试学习如何在 Ada 中使用私有(private)声明以及了解打包。我尽量使我的代码尽可能短。

我们从主文件rectangular_Form.ads开始

with Rectangular_Method_1;
package Rectangular_Form renames Rectangular_Method_1;
-- with Rectangular_Method_2;
-- package Rectangular_Form renames Rectangular_Method_2;

这告诉我们,我们可以有两个实现,并且目前选择了Rectangular_Method_1

然后我们有规范文件 Rectangular_Method_1.ads:

package Rectangular_Method_1 is
type Rectangular is private;

procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular);
procedure Set_Horz (R : in out Rectangular; H : Long_Float);
function Get_Horz (R : Rectangular) return Long_Float;

private
type Rectangular is
record
Horz, Vert: Long_Float;
end record;
end Rectangular_Method_1;

及其主体Rectangular_Method_1.adb:

with Ada.Numerics.Long_Elementary_Functions;
use Ada.Numerics.Long_Elementary_Functions;

package body Rectangular_Method_1 is
procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular) is
begin
D.Horz := Cos (A, Cycle => 360.0);
D.Vert := Sin (A, Cycle => 360.0);
end Vector_Basis_r;

procedure Set_Horz (R : in out Rectangular; H : Long_Float) is
begin
R.Horz := H;
end Set_Horz;

function Get_Horz (R : Rectangular) return Long_Float is
begin
return R.Horz;
end Get_Horz;

end Rectangular_Method_1;

最后是测试脚本:test_rectangular_form.adb:

with Ada.Long_Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Rectangular_Form;
use type Rectangular_Form.Rectangular;

procedure Test_Rectangular_Form is
Component_Horz, Component_Vert, Theta : Long_Float;
Basis_r : Rectangular_Form.Rectangular;

begin
Ada.Text_IO.Put("Enter the angle ");
Ada.Long_Float_Text_IO.Get (Item => theta);

--Vector basis
Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);
Ada.Text_IO.New_Line;

Ada.Text_IO.Put("rhat_min_theta = ");
Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Horz (Basis_r), Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.Put(" ihat + ");
Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Vert (Basis_r), Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.Put (" jhat ");
end Test_Rectangular_Form;

问题(应用于test_rectangular_form.adb):

我正在直接使用组件 A.HorzA.Vert

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

稍后只需使用即可访问水平和垂直组件

    Rectangular_Form.Get_Horz (Basis_r)

    Rectangular_Form.Get_Vert (Basis_r)

这似乎没问题,因为我正在使用方法 Get_HorzGet_Vert 来访问 private Rectangular 水平和垂直组件。但是我直接从命令行读取变量 Theta 并使用

找到它的水平和垂直分量
    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

如果 Rectangular 组件 A.HorzA.Vert 像我定义的那样是私有(private)的,我为什么不必须在发出命令之前使用方法set_Horz(A)set_Vert(A)

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

PS:Set_VertGet_Vert 函数被省略,以保持代码简短。

非常感谢...

最佳答案

why do not I have to use the methods set_Horz(A) and set_Vert(A) prior to issuing the command

因为您正在设置您的私有(private)记录的字段,执行:

Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

(查看 Vector_Basis_r 的实现。)

-- 扩展答案

当您在 Test_Rectangular_Form 过程中声明 Basis_r 变量时,会为该“Rectangular”变量分配内存。此时私有(private)类型中的 Horz 和 Vert 字段存在,但未设置(它们可以包含任何内容)。

当您调用 Rectangular_Form.Vector_Basis_r 时,其实现会设置这些私有(private)字段的值。也许这就是让您感到困惑的地方:声明私有(private)类型的包的主体可以直接访问这些字段。这正是 Vector_Basis_r 在设置它们的值(以及 Set_Vert 和 Set_Horz)时所利用的方面。

关于package - Ada:理解私有(private)类型和理解包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10398922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com