www.digitalmars.com         C & C++   DMDScript  

D - Copying a class object

reply "Derek Parnell" <not available.com> writes:
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
Apr 02 2004
next sibling parent Vathix <vathix dprogramming.com> writes:
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
Apr 02 2004
prev sibling parent "Ben Hinkle" <bhinkle4 juno.com> writes:
"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

 is not the class object itself. Which means that if I want to take a copy

 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

 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

Apr 02 2004