Struct copy, how?
nobody
somebody at somewhere.com
Fri Jan 2 21:48:13 PST 2009
"BCS" <ao at pathlink.com> wrote in message
news:78ccfa2d380248cb3b2f9739eb46 at news.digitalmars.com...
> Reply to nobody,
>
>> (D 1.0)
>>
>> After some problems with my program I found where my problems arose.
>>
>> In my mini example: A function that is supposed to create a new bear
>> from 2
>> exisiting bears ends up altering the original bears.
>> I suspect it has to do with the line ' Bear newBear = bear1;', in that
>> it
>> doesn't copy the contents of the struct.
>> Is there a way to copy a struct without resorting to iterating over
>> all its
>> elements manually?
>
> I think you almost spotted the cause. Bear contains an array (a reference
> type) of Claws. When you copy it you get a new struct with a copy of that
> array (again a reference). Because that array is a reference type it still
> referees to that same set of Claws. You can fix this by copying/duping the
> array
Oh I see. I find it a bit odd that it's copied in this manner, but I bet
there's good reasons for it.
Totally unexpected to me though :)
>
> Bear newBear = bear1;
> newBear.claw = bear1.claw.dup;
>
> IIRC struct now have an opAssign that can burry this in the struct code
> rather than the client code.
Is opAssign available in D1.0?
> However this still has a few problems: 1, if claw contains a reference
> type you will now have 2 Claws that refer to the same thing and 2, you
> need to maintain opAssign to be sure that it copies all members.
>
> One way to attack both of these would be to use a template to build a
> generic deep copy that uses compile time refection to copy all the
> members, duping arrays of PODS, copying basic types and recursively deep
> copying reference types and arrays of them.
>
>
Guess I'll do that.
Thanks for the help!
More information about the Digitalmars-d-learn
mailing list