opOpAssign on object properties

Ivan Kazmenko via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jan 8 02:03:50 PST 2017


On Sunday, 8 January 2017 at 09:22:12 UTC, collerblade wrote:
> How can i do opOpAssign with properties??

1. If you want the member variable to change, naturally, you 
should provide a getter property which returns a reference to 
that variable:

     ref Point location() @property {
       return m_location;
     }

This alone solves the immediate problem.

2. Note that it is common for assignment expressions to return a 
reference to the result, which would, for example, make chains 
like "a = (b += c)" possible:

   ref Point opOpAssign(string op)(in Point p) if (op == "+") {
     x+=p.x;
     y+=p.y;
     return this;
   }

Here's a complete working version of your example:

-----
struct Point {
   float x=0,y=0;

   this(float _x, float _y) {
     x=_x;
     y=_y;
   }

   //opopassign for +=
   ref Point opOpAssign(string op)(in Point p) if (op == "+") {
     x+=p.x;
     y+=p.y;
     return this;
   }
}

class A {
   public:
     ref Point location() @property {
       return m_location;
     }

     void location(in Point newlocation) @property {
       m_location=newlocation;
     }

   private:
     Point m_location;
}

void main() {
   import std.stdio;
   auto a= new A;
   a.location+=Point(1,1);
   writeln (a.location); // Point(1, 1)
   a.location+=Point(1,1);
   writeln (a.location); // Point(2, 2)
}
-----

Ivan Kazmenko.


More information about the Digitalmars-d-learn mailing list