On Thursday, 23 January 2014 at 15:34:38 UTC, FreeSlave wrote:
On Thursday, 23 January 2014 at 15:24:19 UTC, Chris wrote:
Here's what I'm trying to do.

struct Element(T) {
   T x;
   T y;

   public void setX(T value) {
     x = value;
   }
   // More fancy functions ...
}

I store Element(s) in an array and want to pass each one by reference, which does not work.


class Tree {

   Element!string[] elements;

   public ref auto createElement(string name) {
     elements ~= Element!string(name);
     return elements[$-1];
   }
}

in main:

auto tag = Element!string("first");

The elements in Tree.elements and the ones in main are not the same, instead I obtain a copy of each. How can I make them refer to the same Elements? If I have to add a .ptr property to Element, how do I do that? Is that possible at all or did I shoot myself in the foot with the template?

You can use pointer

Tree tree = new Tree();
Element!(string)* element = &tree.createElement("first");

& is to get address of returned value element.

You also can rewrite your function like this:

public Element!(string)* createElement(string name) {
        elements ~= Element!string(name);
        return &elements[$-1];
    }

to return pointer without need to get address on caller side.

Thanks, that was fast! Yes I was tinkering around with pointers, but didn't get it right, you did. However, the output is still the same, i.e. two different sets:

// After creating and changing
<div id="1">
Hello, world!
<span>
</span>
</div>

// The Elements in Tree.elements:
[<div>
</div>
, <span>
</span>
]

Reply via email to