В следующем коде Mix_Card_Reader наследует от Mix_IO_Device, последняя является абстрактной теговой записью.
Ранее она содержала один Positive
и два Stream_Access
члена. Я хотел бы изменить код так, чтобы вместо него использовалось File_Type
членов.
Причина в том, что я хочу, чтобы каждый экземпляр этого типа мог открывать и закрывать свои файлы по мере необходимостиили нет, если нужно.
Проблема в том, что я не могу инициализировать этот наследуемый тип, потому что File_Type
является ограниченным типом. Как я могу написать свою функцию Create_Mix_Card_Reader
, чтобы разрешить это?
.ads ...
type Mix_IO_Device is abstract tagged limited
record
Block_Size : Positive;
Input_File : File_Type;
Output_File : File_Type;
end record;
type Mix_Card_Reader is new Mix_IO_Device with null record;
.adb ...
function Create_Mix_Card_Reader return Mix_IO_Device_Access is
Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(16, null, null);
begin
return Ret;
end Create_Mix_Card_Reader;
GNAT жалуется на то, что я не могу передать null, null
в пару File_Type
членов, потому что они, конечно, несовместимы, нули остаются с тех пор, как это было Stream_Access
участники. Кажется, что я должен передать что-то здесь, но я не хочу преждевременно открывать файлы, просто чтобы успокоить компилятор.
Что делать?
Редактировать: У меня естьпара очевидных вариантов:
- использовать взамен
access File_Type
(но я все еще должен поддерживать открытие / закрытие файлов в другом месте). - хранить все объекты File_Type в массивеотдельно и просто обращайтесь к ним, используя потоки, как и раньше, но это выглядит грязно.