From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,741d9c75087d538f X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-06-06 11:11:49 PST Path: archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!sn-xit-01!sn-post-01!supernews.com!corp.supernews.com!not-for-mail From: "David C. Hoos" Newsgroups: comp.lang.ada Subject: Re: Cloning a Class Wide Data Type with "new"? Date: Fri, 6 Jun 2003 13:11:44 -0500 Organization: Posted via Supernews, http://www.supernews.com Message-ID: References: <3EE097D5.2010901@cogeco.ca> X-Newsreader: Microsoft Outlook Express 6.00.2800.1158 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-Complaints-To: abuse@supernews.com Xref: archiver1.google.com comp.lang.ada:38766 Date: 2003-06-06T13:11:44-05:00 List-Id: "Warren W. Gay VE3WWG" wrote in message news:3EE097D5.2010901@cogeco.ca... > I havn't had much time to research this one yet, but I've > got stuck trying to clone a class wide type this morning, > on my way to work. A sample program is provided below. > > I need to be able to allocate and then copy an arbitrary > tagged type (based upon a base type) into the newly > allocated object. There's gotta be a way to do this.. > I just can't remember it! > > The problem is the operation of the form of : > > Cloned : Base_Access := new Base_Class'(Orig); > > Here is a sample program that distills the problem: > > > with Ada.Text_IO; > use Ada.Text_IO; > > procedure TProg is > > type Base_Type is tagged > record > V : Integer; > end record; > > type Base_Access is access all Base_Type'Class; > subtype Base_Class is Base_Type'Class; > > type Derived_Type is new Base_Type with > record > Z : Natural; > end record; > > -- This is the original object to be cloned > Orig : Derived_Type := ( V => 32, Z => 99 ); > > -- This is a local copy (easy) > Copied : Base_Class := Orig; > > -- Allocate Cloned to be same as Orig (the problem) > Cloned : Base_Access := new Base_Class'(Orig); The operand of the qualified expression must first be converted to the Base_Class -- i.e.: Cloned : Base_Access := new Base_Class'(Base_Class (Orig)); See RM95 4.7 (3) > begin > > Put_Line("Cloned.V = " & Cloned.V'Img); > > end TProg; > > > TIA, Warren. > -- > Warren W. Gay VE3WWG > http://home.cogeco.ca/~ve3wwg > > _______________________________________________ > comp.lang.ada mailing list > comp.lang.ada@ada.eu.org > http://ada.eu.org/mailman/listinfo/comp.lang.ada >