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:38:05 PST Path: archiver1.google.com!postnews1.google.com!not-for-mail From: anh_vo@udlp.com (Anh_Vo) Newsgroups: comp.lang.ada Subject: Re: Cloning a Class Wide Data Type with "new"? Date: 6 Jun 2003 11:38:04 -0700 Organization: http://groups.google.com/ Message-ID: <5a59d6a9.0306061038.18a1072@posting.google.com> References: <3EE097D5.2010901@cogeco.ca> NNTP-Posting-Host: 65.168.133.148 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1054924685 1328 127.0.0.1 (6 Jun 2003 18:38:05 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: 6 Jun 2003 18:38:05 GMT Xref: archiver1.google.com comp.lang.ada:38768 Date: 2003-06-06T18:38:05+00: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); > begin > > Put_Line("Cloned.V = " & Cloned.V'Img); > > end TProg; > > > TIA, Warren. Base_Class is not a real type. Base_Type and Derived_Type are real types. Thefore, either one of them should be used. I assume Derived_Type was your intention in this case. Otherwise, explicit conversion is needed. Both cases are shown below. Cloned : Base_Access := new Derived_Type' (Orig); -- case 1 Cloned : Base_Access := new Base_Type' (Base_Type (Orig)); -- case 2 A. Vo