User defined types: Problems with ref

Ali Çehreli acehreli at yahoo.com
Thu Jan 23 17:26:06 PST 2014


On 01/23/2014 07:26 AM, Chris 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?
 >
 > Sorry in main it is:
 >
 > auto tree = new Tree();
 > auto tag = tree.createElement("first");

createElement does return a reference. However, because D does not have 
local references the type of tag is Element!string (not 'ref 
Element!string').

The following program demonstrates that the address of the returned 
reference is indeed the same as the one that has been created:

import std.stdio;

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

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

class Tree {

     Element!string[] elements;

     public ref auto createElement(string name) {
       elements ~= Element!string(name);
       writefln(" created element at %s", &elements[$-1]);
       return elements[$-1];
     }
}

void main()
{
     auto tree = new Tree();
     writefln("received element at %s", &tree.createElement("first"));
}

Sample output:

  created element at 7F14C72C0F80
received element at 7F14C72C0F80

You can use the returned element directly as well:

     tree.createElement("second").setX("hello");

Ali



More information about the Digitalmars-d-learn mailing list