什么是“扩展聚合”以及为什么需要它?

问题描述 投票:0回答:1

我正在尝试使用 GNAT 的 SQLite 绑定。我想要一些方法来从这些绑定中获取错误。尝试通读代码,我发现我可以通过提供一个应该处理错误的神秘对象来设置连接......

无论我如何尝试塑造和提供这个对象,库要么不接受它,要么我得到运行时访问检查错误(这个程序的另一个奇怪的方面,因为指针应该始终处于活动状态,因为它永远不会离开声明它的过程...但也许它在 Ada 中的工作方式不同)。

我收到的错误如下所示:

type of aggregate has private ancestor "Error_Reporter"
must use extension aggregate

原来的

Error_Reporter
定义如下:

type Error_Reporter is abstract tagged private;
...
private

   type Error_Reporter is abstract tagged null record;

无论如何,下面是有问题的代码的概述:

头文件:

   -- type Error_Handler is new Gse.Error_Reporter with private;
   type Error_Handler is new Gse.Error_Reporter with record
      Message : Asu.Unbounded_String;
   end record;
   
   type Error_Handler_Access is access Error_Handler;

   procedure On_Error
     (Self       : in out Error_Handler;
      Connection : access Gse.Database_Connection_Record'Class;
      Message    : String);

-- more stuff ...
   
-- private
--    type Error_Handler is new Gse.Error_Reporter with record
--       Message : Asu.Unbounded_String;
--    end record;

实施:

...
      declare
         pragma Suppress (Accessibility_Check);
         -- Handler : constant Error_Handler_Access :=
         --   new Error_Handler'(Message => Asu.Null_Unbounded_String);
         Handler : constant access Error_Handler :=
           new Error_Handler'(Message => Asu.Null_Unbounded_String);
         -- Handler : aliased Error_Handler;
         Descr         : Gse.Database_Description    :=
           Gss.Setup (Db_File, Errors => Handler);
--         Gss.Setup (Db_File, Errors => Handler'Access);
...

注释代码显示了我尝试过的各种事情。 (此外,

pragma
没有任何效果)。

理想情况下,我不想

new
任何事情,除非这是 GNAT 接口的要求。

更好:如果我可以完全避免使用这个对象(应该可以从这个包装器中挽救实际的 Sqlite 连接并访问返回代码和错误消息),但代码不太容易阅读并且正在尝试让用户做我不想要的事情(ORM,多层绑定只会使事情变得复杂),同时隐藏基本的有用功能。我很感激这方面的任何指导。

sqlite ada
1个回答
0
投票

由于您的 Error_Handler 扩展了 Gse.Error_Handler,因此您的实例化需要指定基类。尝试:

Handler : constant access Error_Handler :=
           new Error_Handler'(Gse.Error_Handler with Message => Asu.Null_Unbounded_String);

这提供了基类以及您的子类成员

© www.soinside.com 2019 - 2024. All rights reserved.