comp.lang.ada
 help / color / mirror / Atom feed
From: Maciej Sobczak <no.spam@no.spam.com>
Subject: Re: Constructing an object
Date: Fri, 23 Sep 2005 10:23:02 +0200
Date: 2005-09-23T10:23:02+02:00	[thread overview]
Message-ID: <dh0e16$ghc$1@sunnews.cern.ch> (raw)
In-Reply-To: <uhdcctk85.fsf@earthlink.net>

Hi,

Matthew Heaney wrote:

> But that's because you didn't declare the type in such a way that
> initialization is enforced.  You have a few possibilities, including
> declaring the type as private,

Is it really enough? Consider this:

-- file shapes.ads
package Shapes is
    type Color is (Black, White);
    type Shape is private;   -- or tagged private
    function New_Shape(C : in Color) return Shape;
private
    type Shape is record     -- or tagged
       C : Color;
    end record;
end Shapes;

-- file shapes.adb
package body Shapes is
    function New_Shape(C : in Color) return Shape is
    begin
       return Shape'(C => C);  -- I like this syntax :)
    end New_Shape;
end Shapes;

-- file hello.adb
with Shapes;
procedure Hello is
    S : Shapes.Shape;  -- oops, uninitialized Shape
begin
    null;
end Hello;


It compiles fine (GNAT) and it allows me to declare an uninitialized 
object of private type Shape. The only thing that private type gives me 
is that I cannot tinker with its internals directly. This is good in 
itself, but not enough to save me from having uninitialized objects.

I think that the most general approach is with abstract types, although 
at the same time it looks like an overkill in simpler cases and not 
without its own problems. In particular, it introduces an artifical 
hierarchy of types (not counting the cases where the hierarchy already 
exists at the design time, like with true Shapes, Animals, etc.).

I miss constructors. The "real" ones. ;-)
(no flame intended)


> declaring it as private and with an
> unknown discriminant, declaring it with a known discriminant, or giving
> the record components default values.


-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/



  parent reply	other threads:[~2005-09-23  8:23 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-21  8:46 Constructing an object Maciej Sobczak
2005-09-21 10:16 ` Georg Bauhaus
2005-09-22  7:21   ` Maciej Sobczak
2005-09-21 11:55 ` Dmitry A. Kazakov
2005-09-22  7:28   ` Maciej Sobczak
2005-09-22  7:45     ` Maciej Sobczak
2005-09-22 13:33       ` Dmitry A. Kazakov
2005-09-24  5:23         ` Randy Brukardt
2005-09-24  9:47           ` Dmitry A. Kazakov
2005-09-29  0:12             ` Randy Brukardt
2005-09-29  8:17               ` Dmitry A. Kazakov
2005-09-29 22:21                 ` Randy Brukardt
2005-09-30  8:14                   ` Jean-Pierre Rosen
2005-09-30 19:28                     ` Dmitry A. Kazakov
2005-09-30 17:49                   ` Robert A Duff
2005-10-01  0:44                     ` Randy Brukardt
2005-10-01 10:49                       ` Dmitry A. Kazakov
2005-10-01 11:06                       ` Tapio Kelloniemi
2005-10-01 14:13                         ` Robert A Duff
2005-10-02 11:52                           ` Tapio Kelloniemi
2005-10-01 15:19                       ` Georg Bauhaus
2005-09-23  5:40 ` Matthew Heaney
2005-09-23  7:18   ` tmoran
2005-09-23  8:23   ` Maciej Sobczak [this message]
2005-09-23 12:04     ` Dmitry A. Kazakov
2005-09-23 12:36       ` Matthew Heaney
2005-09-23 13:03         ` Hyman Rosen
2005-09-23 13:41           ` Maciej Sobczak
2005-09-23 14:23           ` Matthew Heaney
2006-01-17  6:28             ` [Offtopic] " James Dennett
2005-09-23 13:42         ` Dmitry A. Kazakov
2005-09-23 14:27           ` Matthew Heaney
2005-09-23 12:24     ` Matthew Heaney
2005-09-24  5:34       ` Randy Brukardt
replies disabled

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