Overloading the assignment operator, right now!

pragma ericanderton at yahoo.com
Sat Sep 16 07:13:50 PDT 2006


Hasan Aljudy wrote:
> 
> I vote:
> No for copy operators.
> Specially no for the ugly and cumbersome-to-type := operator.
> 
> Yes for auto-generated copy methods/properties. (both deep and shallow)
> 
> T x = b.dup.deep;
> T y = b.dup.shallow;

The only problem with this is that you can't have a compiler-generated 
deep copy without taking on some serious consequences and/or risks. 
IMO, that's too much effort for a compiler author, for a feature that is 
so limited in use and scope.

Take this guy for example:

class TreeNode{
   TreeNode parent;
   TreeNode[] children;
}

What about cyclic references in networks of objects (.parent in above)? 
  You'd have to have some kind of monitor that keeps track of all the 
references consumed by the dup.deep() process, just to avoid cycles. 
Either it's an Object field that flags its status during a dup() or a 
massive array/map that keeps log of every object touched - either one 
can amount to some very serious space/time overhead.

A stub deep copy, one that lives on Object, isn't possible either since 
D doesn't have the reflection mojo to pull it off.  Even if it did, 
would you really want to generate a deep copy of an object network 
completely via reflection?  It'd be painfully slow.

Invariably, a custom-coded clone() or dup() of some kind that allows for 
deep copying on request is the best approach - take a look at how other 
languages (e.g. Java) shy away from implementing a deep copy directly 
into the language.

class TreeNode{
   TreeNode parent;
   TreeNode[] children;

   TreeNode clone(TreeNode copyParent){
     TreeNode copy = new TreeNode();
     foreach(child; this.children){
       copy.children ~= child.clone(copy);
     }
     copy.parent = copyParent;
     return copy;
   }
}

What's wrong with doing things like this?

Now, I do think that providing a shallow-copy, dup(), as a member of 
Object is a no-brainer.  You can easily do this at the binary level via 
memcopy with little to no effort, and no real side-effects.  Plus it 
would make the current schism between objects and arrays a little less 
obvious (that is, make templates easier to code).



More information about the Digitalmars-d mailing list