Thread overview
Copying a class object
Apr 02, 2004
Derek Parnell
Apr 02, 2004
Vathix
Apr 02, 2004
Ben Hinkle
April 02, 2004
I understand that a class variable holds a reference to the class object and is not the class object itself. Which means that if I want to take a copy of the class object, the class needs to have a method defined in it to implement a copy operation, as a simple assignment just copies the reference and not the object.

So, is there a standard way of coding the call to that copy method?

Maybe an example would help.

class Foo
{
   int a;
   char[] c;

   this() { ... }

   Foo opCopy()
   {
      Foo x = new Foo;
      x.a = a;
      x.c = c;
      return x;
   }
}

and then to invoke a copy of Foo object ...

  Foo x,y;

  x = new Foo;
  y = x.opCopy();

I was just wondering if there is a special syntax or protocol available to invoke a copy operation, or does everybody just do it their own way?

If not, something like ....

  x = new Foo;
  y := x;

would be alright in my view. It would invoke an opCopy() method.

-- 
Derek



April 02, 2004
Derek Parnell wrote:

> I understand that a class variable holds a reference to the class object and
> is not the class object itself. Which means that if I want to take a copy of
> the class object, the class needs to have a method defined in it to
> implement a copy operation, as a simple assignment just copies the reference
> and not the object.
> 
> So, is there a standard way of coding the call to that copy method?
> 
> Maybe an example would help.
> 
> class Foo
> {
>    int a;
>    char[] c;
> 
>    this() { ... }
> 
>    Foo opCopy()
>    {
>       Foo x = new Foo;
>       x.a = a;
>       x.c = c;
>       return x;
>    }
> }
> 
> and then to invoke a copy of Foo object ...
> 
>   Foo x,y;
> 
>   x = new Foo;
>   y = x.opCopy();
> 
> I was just wondering if there is a special syntax or protocol available to
> invoke a copy operation, or does everybody just do it their own way?
> 
> If not, something like ....
> 
>   x = new Foo;
>   y := x;
> 
> would be alright in my view. It would invoke an opCopy() method.
> 

I like dup property. Could have:

interface Dup
{
   Object dup();
}

And classes implement that. I suggest this instead of just adding it to Object because all objects aren't dup-able out of the box.


class Foo: Dup
{
   private byte[] bar; // Something that needs to be duplicated.
   this(byte[] barinit) { bar = barinit.dup; } // Arrays have dup.
   Foo dup() { return new Foo(bar); } // Foo too! (covariant return type)
}

Foo f = new Foo(something);
Foo f2 = f.dup;


I tested it and DMD doesn't like covariant returns with interfaces. There's a lot of problems with interfaces. I changed Dup to an abstract class and it worked.


-- 
Christopher E. Miller
April 02, 2004
"Derek Parnell" <not@available.com> wrote in message news:c4k1ua$1fq1$1@digitaldaemon.com...
> I understand that a class variable holds a reference to the class object
and
> is not the class object itself. Which means that if I want to take a copy
of
> the class object, the class needs to have a method defined in it to implement a copy operation, as a simple assignment just copies the
reference
> and not the object.
>
> So, is there a standard way of coding the call to that copy method?

I'm sure other people have different answers but I have two standards :-)
either use .dup (see the Array doc) or a constructor.
For example for the right definition of Foo
  Foo x,y;
  x = new Foo;
  y = x.dup;
  y = new Foo(x);

> Maybe an example would help.
>
> class Foo
> {
>    int a;
>    char[] c;
>
>    this() { ... }
>
>    Foo opCopy()
>    {
>       Foo x = new Foo;
>       x.a = a;
>       x.c = c;
>       return x;
>    }
> }
>
> and then to invoke a copy of Foo object ...
>
>   Foo x,y;
>
>   x = new Foo;
>   y = x.opCopy();

That would work, though I recomment reserving the "op" prefix for actual operators like opAdd, etc. If your suggested operator := is added to the language then opCopy would be fine.

> I was just wondering if there is a special syntax or protocol available to invoke a copy operation, or does everybody just do it their own way?
>
> If not, something like ....
>
>   x = new Foo;
>   y := x;
>
> would be alright in my view. It would invoke an opCopy() method.
>
>
> -- 
> Derek