Thread overview | ||||||
---|---|---|---|---|---|---|
|
June 02, 2008 opAssign in D2 | ||||
---|---|---|---|---|
| ||||
hi, i like to copy objects such as: class A {....} A xxx; // some things are done ... A yyy = xxx; how can one do that in D2 easy? are any samples? thanks |
June 02, 2008 Re: opAssign in D2 | ||||
---|---|---|---|---|
| ||||
Posted in reply to lurker | Reply to lurker,
> hi,
>
> i like to copy objects such as:
>
> class A {....}
>
> A xxx; // some things are done ...
>
> A yyy = xxx;
>
> how can one do that in D2 easy? are any samples?
>
> thanks
>
first, classes are reference types so the above needs to be:
A xxx = new A;
// some things are done ...
A yyy = xxx;
second, that assignment will work as is but will act as a reference copy (you get two copies of the reference to the same object). If you want a real copy you can use structs or generate a deep copy function for the class. I don't use 2.0 so someone else will need to fill in the details.
|
June 02, 2008 Re: opAssign in D2 | ||||
---|---|---|---|---|
| ||||
Posted in reply to lurker | On Mon, 02 Jun 2008 20:08:29 +0400, lurker <lurker@lurker.com> wrote:
> hi,
>
> i like to copy objects such as:
>
> class A {....}
>
> A xxx; // some things are done ...
>
> A yyy = xxx;
>
> how can one do that in D2 easy? are any samples?
>
> thanks
>
>
You shouldn't use this for by design, it's not supported for reference types, only for structs.
But you might consider wrapping the class into a struct with overloaded opAssign semantics.
It sould work fine for you (after opImplicitCast is implemented :)).
The other limitation of opAssign is that you can't override opAssign to accept object of the same type:
T t1;
T t2;
t1 = t2; // can't be hooked :(
Compiler just makes a plain bitwise copy of the object in any case.
I was trying to implement C++-style reference (Ref!(T) template), it works fine but the I didn't find any way to disallow reference rebindment:
int i = 5;
Ref!(int) ri = i;
ri = 0;
assert(ri == i);
--ri;
assert(ri == i);
ri *= 2;
assert(ri == i);
ri ^= 4;
assert(ri == i);
int t = 0;
ri = Ref!(int)(&t); // that's what I want to disallow, but can't :(
assert(ri == i);
Anyone knows how to workaround this?
|
June 02, 2008 Re: opAssign in D2 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Koroskin Denis | Reply to Koroskin,
> On Mon, 02 Jun 2008 20:08:29 +0400, lurker <lurker@lurker.com> wrote:
>
>> hi,
>>
>> i like to copy objects such as:
>>
>> class A {....}
>>
>> A xxx; // some things are done ...
>>
>> A yyy = xxx;
>>
>> how can one do that in D2 easy? are any samples?
>>
>> thanks
>>
> You shouldn't use this for by design, it's not supported for reference
> types, only for structs.
> But you might consider wrapping the class into a struct with
> overloaded
> opAssign semantics.
> It sould work fine for you (after opImplicitCast is implemented :)).
> The other limitation of opAssign is that you can't override opAssign
> to accept object of the same type:
>
It's not really clean but making a dup() method would be constant with D's arrays.
|
Copyright © 1999-2021 by the D Language Foundation