Судя по этому посту, попробую сделать запись с приватной частью. Что я наделал :
Мой файл.ads :
package MyPackage is
type T_MyType is tagged private;
private
type T_MyType_Private_Part;
type T_MyType_Private_Part_Access is access T_MyType_Pirvate_Part;
type T_MyType is tagged record
Toto : Boolean;
end record
end MyPackage;
Мой файл.adb:
package body MyPackage is
type T_MyType_Private_Part is record
Private_Toto : Boolean;
end record
end MyPackage;
Но когда другой пакет делает MyVar.Toto
, где MyVar
есть T_MyType
, у меня возникает ошибка:
нет селектора «Toto» для типа «T_MyType», определенного в MyFile.ads
Как я могу это исправить ?
Я не знаю, что означает «запись с приватной частью» (в записях Ады нет приватных частей), но, как сказано в Ada Distilled, «Понимание видимости — это ключ к пониманию Ады» и « Некоторые программисты считают концепцию видимости более сложной, чем любую другую часть Ады. Как только они действительно поймут видимость, все остальное в [этом] языке обретет смысл». Это неправильное понимание правил видимости Ады, поэтому вам нужно с ними ознакомиться.
Другой пакет не может видеть Тото именно потому, что вы сделали его приватным. Другой пакет может использовать только операции, опубликованные MyPackage (определенные в его общедоступной части), для взаимодействия с Toto (но пока их нет).
С помощью Ады очень просто создать запись с приватной частью.
В следующем примере объявляется базовый тегированный тип с открытым членом. Затем он создает дочерний пакет, который расширяет помеченный тип закрытыми членами. Тип, объявленный в дочернем пакете, имеет как открытые, так и закрытые элементы данных.
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
package base_type is
type base is tagged record
Name : Unbounded_String;
end record;
end base_type;
Пакет с именем base_type объявляет помеченную запись с общедоступным членом.
package base_type.person is
type gender is (male, female);
type weights is new Float range 0.0 .. 500.0;
type person_type is new base with private;
procedure set_gender (P : in out person_type; G : in gender);
procedure set_weight (P : in out person_type; W : in weights);
procedure Print (P : person_type);
private
type person_type is new base with record
G : gender;
W : weights;
end record;
end base_type.person;
Тело base_type.person
with Ada.Text_IO; use Ada.Text_IO;
package body base_type.person is
----------------
-- set_gender --
----------------
procedure set_gender (P : in out person_type; G : in gender) is
begin
P.G := G;
end set_gender;
----------------
-- set_weight --
----------------
procedure set_weight (P : in out person_type; W : in weights) is
begin
P.W := W;
end set_weight;
-----------
-- Print --
-----------
procedure Print (P : person_type) is
package w_io is new Float_IO(weights);
use w_io;
begin
Put_Line(To_String(P.Name));
Put_Line ("Gender: " & P.G'Image);
Put("Weight: ");
Put(Item => P.W, Fore => 1, aft => 1, Exp => 0);
New_Line(2);
end Print;
end base_type.person;
Следует ожидать, что к закрытым элементам данных можно получить доступ только через процедуры и функции.
Основной процедурой создания примера программы является
with base_type.person; use base_type.person;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure Main is
P1 : person_type;
P2 : person_type;
begin
P1.set_gender (Male);
P1.set_weight (165.2);
P1.Name := To_Unbounded_String ("Barney Rubble");
P2.Name := To_Unbounded_String ("Betty Rubble");
P2.set_gender (female);
P2.set_weight (110.5);
Print (P1);
Print (P2);
end Main;
Вывод этой программы:
Barney Rubble
Gender: MALE
Weight: 165.2
Betty Rubble
Gender: FEMALE
Weight: 110.5
Поскольку ваш тип T_MyType является приватным, вы не можете получить доступ ни к чему внутри приватной части. Вам нужно будет предоставить подпрограммы для работы с Тото. См. en.wikibooks.org/wiki/Ada_Programming/Packages#The_private_part