comp.lang.ada
 help / color / mirror / Atom feed
From: Brian Drummond <brian@shapes.demon.co.uk>
Subject: Re: Why is the destructor called multiple times after I declare an object?
Date: Mon, 11 Jan 2016 17:02:01 -0000 (UTC)
Date: 2016-01-11T17:02:01+00:00	[thread overview]
Message-ID: <n70n69$ecn$4@dont-email.me> (raw)
In-Reply-To: c8f04467-9167-4be3-85cc-37692bb2ea31@googlegroups.com

On Sun, 10 Jan 2016 19:35:43 -0800, Andrew Shvets wrote:

> On Sunday, January 10, 2016 at 9:18:57 PM UTC-5, Jeffrey R. Carter
> wrote:
>> On 01/10/2016 06:37 PM, Andrew Shvets wrote:
>> > 
>> > Why is "Resetting values of Creat to defaults." displaying 6 times as
>> > opposed to just twice?
>> 
>> ARM 7.6(13-17.1) apply here. Note that Init declares a local variable
>> of the type, 
> 
> I see.  Thank you for your explanation.

Note that for the default initialisation case, if you override 
Initialize, it will be called automatically.

  overriding procedure Initialize(
    Creat : in out Creature) is
  begin
    Ada.Text_IO.Put_Line("Initializing values of Creat to defaults.");

    Creat.Name          := Ada.Strings.Unbounded.To_Unbounded_String
("Ferret");
    Creat.Legs          := 3;
    Creat.WeightInGrams := 100;
    Creat.HeightInCm    := 7;
  end Initialize;

(yes the ferret lost a leg somehow).

Because it's a procedure, with In Out parameters, it operates in-place, 
avoiding both the creation of a temporary object, and assignment.

Now the main program
  Var1 : Animal.Creature; --:= Animal.Init; -- default constructor
  Var2 : Animal.Creature := Animal.Init("Elephant", 4, 4000000, 500);
begin
  Animal.Print_Record(Var1);
  Animal.Print_Record(Var2);
end main_animal;
initialises both variables to the defaults, then operates as Jeffery 
answered for the non-default Init function (I overrode Adjust to track 
assignments).

Initializing values of Creat to defaults.
Initializing values of Creat to defaults.
Adjusting Creature named Elephant
Resetting values of Creat to defaults.
Adjusting Creature named Elephant
Resetting values of Creat to defaults.
 The animal:
  The name:        Ferret
  Number of legs:   3
  Weight in grams:  100
  Height in cm:     7
 The animal:
  The name:        Elephant
  Number of legs:   4
  Weight in grams:  4000000
  Height in cm:     500
Resetting values of Creat to defaults.
Resetting values of Creat to defaults.

Rewriting Init (the non-default constructor) as a procedure would 
eliminate the intermediate variables and assignments. 

It would have to be called at the start of the main program instead of as 
an initialiser. Regrettably there seems to be no syntax for calling non-
default initializers on a controlled type.

-- Brian



  reply	other threads:[~2016-01-11 17:02 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-11  1:37 Why is the destructor called multiple times after I declare an object? Andrew Shvets
2016-01-11  2:18 ` Jeffrey R. Carter
2016-01-11  3:35   ` Andrew Shvets
2016-01-11 17:02     ` Brian Drummond [this message]
2016-01-11 16:29   ` Brian Drummond
2016-01-11 17:20     ` Simon Wright
2016-01-11 18:17     ` Bob Duff
2016-01-11 21:10       ` Dmitry A. Kazakov
2016-01-11 23:44         ` Randy Brukardt
2016-01-12  9:33           ` Dmitry A. Kazakov
2016-01-12 20:21             ` Randy Brukardt
2016-01-12 21:05               ` Dmitry A. Kazakov
2016-01-13  0:02                 ` Robert A Duff
2016-01-13  8:31                   ` Dmitry A. Kazakov
2016-01-13  9:01                     ` Georg Bauhaus
2016-01-13 14:45                     ` J-P. Rosen
2016-01-13 20:09                       ` Dmitry A. Kazakov
2016-01-14  9:04                         ` J-P. Rosen
2016-01-14  9:47                           ` Dmitry A. Kazakov
2016-01-13 16:03                     ` Robert A Duff
2016-01-13 19:59                       ` Dmitry A. Kazakov
2016-01-14 10:04                         ` Georg Bauhaus
2016-01-14 13:42                           ` Dmitry A. Kazakov
2016-01-12 12:41       ` Brian Drummond
2016-01-13 20:18       ` Jacob Sparre Andersen
2016-01-14  1:31         ` Robert A Duff
2016-01-12  0:43     ` Jeffrey R. 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