Thread overview | |||||
---|---|---|---|---|---|
|
April 02, 2004 Copying a class object | ||||
---|---|---|---|---|
| ||||
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 Re: Copying a class object | ||||
---|---|---|---|---|
| ||||
Posted in reply to Derek Parnell | 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 Re: Copying a class object | ||||
---|---|---|---|---|
| ||||
Posted in reply to Derek Parnell | "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 |
Copyright © 1999-2021 by the D Language Foundation