re-creating C++'s reference bahavior
swiftcoder
swiftcoder at darkcoda.com
Tue Apr 17 07:21:33 PDT 2007
What it really gets down to, is that I don't want to increase the code complexity needlessly. For many reasons, there shouldn't be a copy made when all we want to do is query a member, and we musn't have a copy when we set a member:
float x = n.position.x; // or:
n.position.x = 10;
But we do want a copy when we request the whole vector:
Vector3f v = n.position;
So maybe the best thing is to override opAssign() to copy (thus behaving like a struct). Then the olnly thing to make sure is that functions taking a vector as an 'in' argument make a local copy rather than modifying the argument directly. And since opAdd, etc. already produce new vectors, I don't think that will be much of a problem.
Does this make sense to you?
Derek Parnell Wrote:
> On Mon, 16 Apr 2007 20:47:31 -0400, swiftcoder - Tristam MacDonald wrote:
>
> > I am fairly new to D, from a C++ background, and I am having a
> > hard time coming up with a sensible way to deal with what is
> > a fairly trivial example in C++:
> > ...
> > But now in D, I find that the last statement requires ...
>
> Does this below help any?
>
> ////////////////////
> import std.stdio;
>
> class Vector3f
> {
> int x;
> float y;
> }
>
> class Node
> {
> Vector3f m_position; // (reference to) a Vector
> Vector3f position() // Copy-getter
> {
> Vector3f t = new Vector3f;
> // copy fields by hand
> t.x = m_position.x;
> t.y = m_position.y;
>
> return t;
> }
>
> Vector3f* position_flds() // Reference-getter
> {
> return &m_position;
> }
>
> this() { m_position = new Vector3f; }
> }
>
> void main()
> {
> Node n = new Node;
>
> writefln("A %s %s", n.position.x, n.position.y);
> n.position_flds.x = 1;
> n.position_flds.y = 2.2;
> writefln("B %s %s", n.position.x, n.position.y);
>
> Vector3f v = n.position;
> writefln("C %s %s", v.x, v.y);
> v.x = 10;
> v.y = 9.9;
> writefln("D %s %s", v.x, v.y);
> writefln("E %s %s", n.position.x, n.position.y);
> }
> ///////////////////
>
>
> --
> Derek
> (skype: derek.j.parnell)
> Melbourne, Australia
> "Justice for David Hicks!"
> 17/04/2007 5:30:04 PM
More information about the Digitalmars-d-learn
mailing list