comp.lang.ada
 help / color / mirror / Atom feed
From: Yukicanis <yukicanis@googlemail.com>
Subject: Re: type access Parent'Class
Date: Mon, 21 Nov 2011 11:40:12 -0800 (PST)
Date: 2011-11-21T11:40:12-08:00	[thread overview]
Message-ID: <c3ca6466-741c-4d97-8128-9dd48221aa55@h21g2000yqg.googlegroups.com> (raw)
In-Reply-To: cf11dc37-33a6-4c62-bfd9-4165e6f83dd5@h30g2000pro.googlegroups.com

On Nov 21, 8:25 pm, Adam Beneschan <a...@irvine.com> wrote:
> On Nov 21, 11:03 am, Yukicanis <yukica...@googlemail.com> wrote:
>
>
>
>
>
>
>
>
>
> > Dear Group,
>
> > I'm new to Ada and currently playing around with its OOP features.
> > Now, I have the following source:
>
> > procedure Test is
> >   type Parent is tagged limited null record;
> >   type Parent_Access is access Parent'Class;
> >   A : access Parent'Class;
> >   B : Parent_Access;
> >   procedure Dyn_Disp(X : access Parent'Class) is
> >   begin
> >     A := X;
> >     B := X;
> >   end Dyn_Disp;
> > begin
> >   null;
> > end Test;
>
> > When I try to complie that with GNAT 4.6.1 I get the following error
> > message:
>
> > test.adb:9:10: expected type "Parent_Access" defined at line 3
> > test.adb:9:10: found type access to "Parent'Class" defined at line 6
>
> > which I don't really understand since type "Parent_Access" is type
> > access to Parent'Class, isn't it?
>
> > Thanks in advance.
>
> Ada is a strongly typed language.  That means that you can have two
> types that look exactly the same but are still different types,
> because you've declared them as different types, and you can't just
> use them interchangeably.  Example:
>
>   type Acc_Type_1 is access all Integer;
>   type Acc_Type_2 is access all Integer;
>   V1 : Acc_Type_1;
>   V2 : Acc_Type_2;
>
>   V1 := V2;     -- ILLEGAL!
>
> This is illegal because V1 and V2 have different types, even though
> the types look the same.  You have to use a type conversion:
>
>   V1 := Acc_Type_1(V2);  -- LEGAL
>
> This doesn't have anything to do with access types, by the way.  All
> types in Ada are like that.
>
> In your original example, "access Parent'Class" is an anonymous type,
> and every time an anonymous type occurs, it's a new type.  So that's
> why
>
>   B := X;
>
> is illegal.  You have to use a type conversion:
>
>   B := Parent_Access(X);
>
> That still won't quite work, because anonymous access types are
> "general" access types and their values can point to any aliased
> Parent'Class object.  However, Parent_Access is called a "pool-
> specific" access type because it can only point to objects that are
> allocated with "new".  To make Parent_Access a general access type,
> add an "all":
>
>   type Parent_Access is access all Parent'Class;
>
> and now your example will compile.  In my view, there isn't much
> reason *not* to use "all" in an access type declaration, and I've
> gotten in the habit of including it routinely.  (But you can't use
> "all" like this if it's not in a TYPE declaration.)
>
> The language allows
>
>   A := X;
>
> even though A and X have different types, because there's no way to
> write a type conversion.  This is an exception to the strong-typing
> rules.
>
> Hope this helps,
>
>                          -- Adam

Yes, that helps me a lot! That you very much!

BTW, I just discovered that

    B := A.all'Access;

also seems to work (with access all). But won't the rigth hand side
result in an anonymous type again?

Thanks in advance.



  reply	other threads:[~2011-11-21 19:40 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-21 19:03 type access Parent'Class Yukicanis
2011-11-21 19:25 ` Adam Beneschan
2011-11-21 19:40   ` Yukicanis [this message]
2011-11-21 19:45     ` Robert A Duff
2011-11-21 19:46       ` Yukicanis
2011-11-21 23:45   ` Gene
2011-11-22  8:42     ` Dmitry A. Kazakov
2011-11-22 10:07       ` Georg Bauhaus
2011-11-22 13:27         ` Simon Wright
2011-11-22 16:13           ` Georg Bauhaus
2011-11-21 19:33 ` Robert A Duff
2011-11-21 19:44   ` Yukicanis
2011-11-24 10:33   ` Yannick Duchêne (Hibou57)
2011-11-24 11:18     ` Yukicanis
2011-11-21 21:09 ` Jeffrey Carter
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox