CharlesBrown
CharlesBrown

Reputation: 1

ADA Object-Orientation Compile Error -- I don't understand the error

I hope that you can advise me. I'm trying to use ADA 95's Object Oriented Features for the first time, and I want two derived classes, cyclicgroup and polyggroup, to call the put() method belonging to their base class, abstractGroup. But instead of tracing up the class hierarchy as I expected, the compiler just tells me that I have a type mismatch in the call to put(). How do I tell the compiler to recognize the connection between the objects?

Here are the 5 files, with all the extraneous stuff removed, and the attempted compile:

grpdriver2.adb:

with Ada.Text_IO; use Ada.Text_IO; with Ada.Command_Line; use Ada.Command_Line;

with groupstuff2; with subgrphandler2;

procedure grpdriver2 is
    cycg:  groupStuff2.cyclicgroup;
    polyg: groupStuff2.polygonGroup;
begin

    cycg := groupstuff2.createCyclicGroup( 10);
    subgrphandler2.put(cycg);   -- line 13

    ------------------------------------------------------------------------------------------------------------------

    polyg := groupstuff2.createPolygonGroup( 10);
    subgrphandler2.put(polyg);     -- line 18

end grpdriver2;

.................................................................................................................

groupstuff2.ads:

with Ada.Text_IO; use Ada.Text_IO; with Ada.Command_Line; use Ada.Command_Line;

package groupstuff2 is

type abstractGroup is tagged record
    x: integer;
end record;


type cyclicGroup is new abstractGroup with record
    y: integer;
end record;


function createCyclicGroup( size: in integer)  return cyclicGroup ;

----------------------------------------

type polygonGroup is new abstractGroup with record
    null;
end record;

function createPolygonGroup( size: in integer) return polygonGroup ;

end groupstuff2;

.......................................................................................

groupstuff2.adb:

package body groupstuff2 is

procedure put( g: in abstractGroup) is
    x: integer;
begin
    x := 1;
end put;


function createCyclicGroup( size: in integer)  return cyclicGroup is
    cycg: cyclicGroup;
begin
    cycg.x := size;

    return cycg;

end createCyclicGroup;

function createPolygonGroup( size: in integer) return polygonGroup is
    polyg: polygonGroup;
begin
    polyg.x := size;


    return polyg;

end createPolygonGroup;

end groupstuff2;

..............................................................................

subgrphandler2.ads:

with Ada.Text_IO; use Ada.Text_IO; with Ada.Command_Line; use Ada.Command_Line;

with groupstuff2;

package subgrphandler2 is

procedure  put( g: in groupStuff2.abstractGroup);

end subgrphandler2;

...........................................................................................

subgrphandler2.adb:

package body subgrphandler2 is

procedure  put( g: in groupStuff2.AbstractGroup) is

begin
        put("THIS IS A PUT STATMENT");      
end put;

end subgrphandler2;

COMPILE ATTEMPT:

C:\GNAT\2018\bin\ceblang>gnatmake grpdriver2 gcc -c grpdriver2.adb grpdriver2.adb:13:36: expected type "abstractGroup" defined at groupstuff2.ads:7 grpdriver2.adb:13:36: found type "cyclicGroup" defined at groupstuff2.ads:16 grpdriver2.adb:18:36: expected type "abstractGroup" defined at groupstuff2.ads:7 grpdriver2.adb:18:36: found type "polygonGroup" defined at groupstuff2.ads:25 gnatmake: "grpdriver2.adb" compilation error

Upvotes: 0

Views: 129

Answers (1)

DeeDee
DeeDee

Reputation: 5941

I cannot compile Ada95 code as I'm using GNAT CE 2018 (which only supports Ada 2012), but it seems that you need to add the Class attribute to the type of the argument of put in subgrphandler2 to make it accept a class wide type (i.e. groupStuff2.AbstractGroup, and all of its extensions (inherited types)).

You also might want to make groupStuff2.AbstractGroup actually abstract by adding the abstract keyword to its definition (see below).

This (reformatted code) compiles on GNAT CE 2018 in Ada 2012 mode:

group_driver_2.adb

with Group_Stuff_2; 
with Sub_Group_Handler_2;

procedure Group_Driver_2 is

   Cycg  : Group_Stuff_2.Cyclic_Group;
   Polyg : Group_Stuff_2.Polygon_Group;

begin

   Cycg := Group_Stuff_2.Create_Cyclic_Group (10);
   Sub_Group_Handler_2.Put (Cycg);

   Polyg := Group_Stuff_2.Create_Polygon_Group (10);
   Sub_Group_Handler_2.Put (Polyg);

end Group_Driver_2;

group_stuff_2.ads

package Group_Stuff_2 is

   type Abstract_Group is abstract tagged 
      record
         X: Integer;
      end record;

   --  Cyclic_Group 

   type Cyclic_Group is new Abstract_Group with 
      record
         Y: Integer;
      end record;

   function Create_Cyclic_Group
     (Size: in Integer)  return Cyclic_Group;

   --  Polygon_Group 

   type Polygon_Group is new Abstract_Group with null record;

   function Create_Polygon_Group
     (Size: in Integer) return Polygon_Group ;

end Group_Stuff_2;

group_stuff_2.adb

package body Group_Stuff_2 is

   -------------------------
   -- Create_Cyclic_Group --
   -------------------------

   function Create_Cyclic_Group
     (Size : in Integer) return Cyclic_Group
   is
      Cycg : Cyclic_Group;
   begin
      Cycg.X := Size;
      return Cycg;
   end Create_Cyclic_Group;

   --------------------------
   -- Create_Polygon_Group --
   --------------------------

   function Create_Polygon_Group
     (Size : in Integer) return Polygon_Group 
   is
      Polyg: Polygon_Group;
   begin
      Polyg.X := Size;
      return Polyg;
   end Create_Polygon_Group;

end Group_Stuff_2;

sub_group_handler_2.ads

with Group_Stuff_2;

package Sub_Group_Handler_2 is

   procedure Put (G : in Group_Stuff_2.Abstract_Group'Class);

end Sub_Group_Handler_2;

sub_group_handler_2.adb

with Ada.Text_IO; use Ada.Text_IO;

package body Sub_Group_Handler_2 is

   procedure Put (G: in Group_Stuff_2.Abstract_Group'Class) is
   begin
      Put_Line ("Value of X is" & Integer'Image (G.X));      
   end Put;

end Sub_Group_Handler_2;

Upvotes: 0

Related Questions