Regan Heath regan at netwin.co.nz
Sat Mar 18 02:14:46 PST 2006


On Fri, 17 Mar 2006 06:17:41 +0000 (UTC), Hong Wing  
<Hong_member at pathlink.com> wrote:
> There are 3 drawbacks with the pointer approach
>
> 1. Noticed that you have 2 versions of the same method, one takes Foo in  
> by pointer and one takes in by value.

That is an option, not a drawback. It gives you the _option_ of passing  
either a pointer to a Foo or a Foo directly. It's more than you could do  
previously :)

> 2. returning pointer would break client code if a field is changed to a
> property.

How? Can you give me an example of some code, written to use a field,  
which fails when it becomes a property?
(assuming of course that the required operator overloads are added, like  
the one I show below)

If I add:

   public Foo ffoo;

to Bar, I can say:

b.ffoo = t;
b.ffoo.x = 5;

which looks the same as:

b.foo = t;
b.foo.x = 5;

> 3. you cannot call operators from pointers, without adding in *  
> everywhere.

Partially true, i.e. when you're trying to add two Foo* together, however  
you can add the following to the Foo struct to add a Foo* to a Foo:

	Foo opAdd(Foo rhs)
	{
		Foo n;
		
		n.x = x+rhs.x;
		n.y = y+rhs.y;
		n.z = z+rhs.z;
	}
	
	Foo opAdd(Foo* rhs)
	{
		return opAdd(*rhs);
	}	

Regan


> In article <ops6i24bii23k2f5 at nrage.netwin.co.nz>, Regan Heath says...
>>
>> On Thu, 16 Mar 2006 06:34:34 +0000 (UTC), Hong Wing
>> <Hong_member at pathlink.com> wrote:
>>> Thanks everyone here for your great work in D, especially Walter who
>>> makes it
>>> all happen.
>>> Here I am requesting a feature, which is "inout variable" and "inout
>>> return
>>> type"
>>> Rationale, for the example below,
>>>
>>> struct Foo
>>> {
>>> int x, int y, int z;
>>> }
>>>
>>> class Bar
>>> {
>>> private:
>>> Foo m_foo;
>>> public:
>>> Foo foo() { return m_foo; }
>>> Foo foo(Foo value) { return m_foo = value; }
>>> }
>>>
>>> now if i want to change the value of m_foo.x to 5, i have to do
>>>
>>> Foo foo = bar.foo;
>>> foo.x   = 5;
>>> bar.foo = foo;
>>>
>>> it would be nice if I can define a return type as "inout Foo"
>>> inout Foo foo() { return m_foo;}
>>>
>>> To extend it further, one might want to define inout variables as
>>> inout Foo foo = bar.foo;
>>>
>>> Advantages:
>>>
>>> 1. efficiency, one can directly change the states of the struct instead
>>> of
>>> making a copy first, change the copy, and put the result back to the
>>> struct
>>>
>>> 2. less buggy, having to type 3 lines always increases chance of bugs,
>>> also,
>>> someone might inadvertantly do bar.foo.x = 5 and forgot that he is
>>> working on a
>>> copy
>>>
>>> 3. reduce the use of pointers, the above can be achieved using  
>>> pointers,
>>> but it
>>> means defining two versions of the same method every time a struct
>>> property is
>>> written.
>>
>> You're essentially asking for the ability to have variables which are
>> references to structs (at least during assignment) and to return
>> references to structs, all without using the pointer syntax. I think  
>> these
>> things are un-necessary, and I think what you want can be achieved with
>> pointers, without the penalty you mention in #3 above, see:
>>
>> import std.string;
>> import std.stdio;
>>
>> struct Foo
>> {
>> 	int x;
>> 	int y;
>> 	int z;
>> 	char[] toString() { return
>> "("~std.string.toString(x)~","~std.string.toString(y)~","~std.string.toString(z)~")";
>> }
>> }
>>
>> class Bar
>> {
>> private:
>> 	Foo m_foo;
>> public:
>> 	Foo* foo() { return &m_foo; }
>> 	Foo* foo(Foo* value) { m_foo = *value; return foo(); }	
>> 	Foo* foo(Foo value)  { m_foo = value;  return foo(); }
>> }
>>
>> void main()
>> {
>> 	Bar b = new Bar();
>> 	Bar c = new Bar();
>> 	Foo t;
>> 	
>> 	b.foo.x = 1;
>> 	b.foo.y = 2;
>> 	b.foo.z = 3;	
>> 	writefln(b.foo.toString());
>> 	
>> 	c.foo = b.foo;
>> 	writefln(c.foo.toString());
>> 	
>> 	t.x = 4;
>> 	t.y = 5;
>> 	t.z = 6;
>> 	writefln(t.toString());
>> 	
>> 	b.foo = t;
>> 	writefln(b.foo.toString());
>> }
>>
>> Note: The explicit "toString" calls are required because otherwise it
>> prints the pointer address.
>>
>> Regan
>
>




More information about the Digitalmars-d mailing list