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, T_FILL_THIS_FORM_SHORT autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,901038687c38f61c X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news1.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newshosting.com!nx02.iad01.newshosting.com!newsfeeds.sol.net!posts.news.twtelecom.net!nnrp2.twtelecom.net!not-for-mail From: "Matthew Heaney" Newsgroups: comp.lang.ada References: <41752559$0$91011$39cecf19@news.twtelecom.net> <138j4nfhzsc45$.1581kzqfi5e89$.dlg@40tude.net> <41753277$0$74190$39cecf19@news.twtelecom.net> <14c2cz6mqb2jr.14y3calkn0fm7$.dlg@40tude.net> Subject: Re: Idiom for a class and an object in Ada Date: Wed, 20 Oct 2004 11:23:12 -0400 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-RFC2646: Format=Flowed; Response X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Message-ID: <417682e0$0$91007$39cecf19@news.twtelecom.net> Organization: Time-Warner Telecom NNTP-Posting-Date: 20 Oct 2004 15:23:13 GMT NNTP-Posting-Host: 11e43aa2.news.twtelecom.net X-Trace: DXC=U>=^56;bfK@54`^_eAU6dKC_A=>8kQj6MhHXa^^g6TZD<4TLheeGkdAdYZAA8S: "Marin David Condic" wrote in message news:UUsdd.3499$ta5.1160@newsread3.news.atl.earthlink.net... > > So now you want to say "I have this 'class' called a Blivet and I might > want to have a "Blue_Blivet" and a "Shiny_Blue_Blivet" and a > "Big_Shiny_Blue_Blivet" so the natural thing to do is make a 'class' from > a package and a tagged type and a bunch of subprograms. You still haven't explained why TYPE Blivet is tagged and nonlimited. > Having done that, you find you have a constraint: For reasons having > nothing special to do with Ada, you want all the data for the 'objects' of > that class to be in static storage and not involve access types and all > that. No generics because of code bloat and other issues. Any other issues > such as private vs limited private are all just sidebars having nothing > special to do with the question at hand. You can get what I describe with > a simple declaraion of "My_Blivet : Blivet;" put somewhere at the Library > level. To repeat my question: > > What is the preferred Ada idiom (when talking about Object Oriented > methodology) for declaring those objects? To repeat my answer: declare the TYPE as limited and indefinite, and declare selector functions that return references to the statically declared instances. Just like Text_IO. Limited types are passed by reference, so one way to do sans access types is like this: package Blivets is type Blivet (<>) is limited private; procedure Op (B : Blivet); function My_Blivet return Blivet; private type Blivet is limited record .. end record; end; package body Blivets is ... My_Blivet_Object : Blivet; function My_Blivet return Blivet is begin return My_Blivet_Object; end; end Blivets; Limited types are passed by reference, so neither allocation nor access types are necessary. Note that using access types doesn't imply allocation, so it's not clear to me what you have against access types. Another possibility is to implement the type as an access type (so direct pointer manipulation isn't necessary): package Blivets is type Blivet (<>) is limited private; procedure Op (B : Blivet); function My_Blivet return Blivet; private type Rep_Type is ; type Blivet is access all Rep_Type; for Blivet'Storage_Size use 0; end Blivets; package body Blivets is ... My_Blivet_Object : aliased Rep_Type; function My_Blivet return Blivet is begin return My_Blivet_Object'Access; end; end Blivets; This has the benefit that objects are allocated statically, and all uses of pointers are hidden from the user. Yet another possibility is to expose the access type, but pass the object as an access parameter: package Blivets is type Blivet (<>) is limited private; procedure Op (B : access Blivet); type Blivet_Access is access all Blivet; for Blivet_Access'Storage_Size use 0; My_Blivet : constant Blivet_Access; private type Blivet is limited record ... end record; My_Blivet_Object : aliased Blivet; My_Blivet : constant Blivet_Access := My_Blivet_Object'Access; end Blivets; So take your pick! In all cases, the objects are declared statically, which satisfies your primary constraint.