Jump to page: 1 2
Thread overview
delegate reference
Sep 09, 2009
Saaa
Sep 09, 2009
Daniel Keep
Sep 09, 2009
Saaa
Sep 09, 2009
Daniel Keep
Sep 09, 2009
Saaa
Sep 09, 2009
BCS
Sep 09, 2009
Ary Borenszweig
Sep 09, 2009
Saaa
Sep 09, 2009
Daniel Keep
Sep 09, 2009
Saaa
Sep 09, 2009
BCS
Sep 09, 2009
Saaa
Sep 09, 2009
BCS
Sep 09, 2009
Saaa
September 09, 2009
abstract class C
{
 int method();
}
class C2:C
{
 int method() return 2;
}
class C3:C
{
 int method() return 3;
}
int delegate() deleg;
void main()
{
 C c;
 C2 c2 = new C2;
 C3 c3 = new C3;
 c=c2;
 deleg = &c.method;
 writefln(deleg()); // 2
 c=c3;
 writefln(deleg()); // 2
 // I expected this to write 3, why is this not so?


September 09, 2009

Saaa wrote:
> abstract class C
> {
>  int method();
> }
> class C2:C
> {
>  int method() return 2;
> }
> class C3:C
> {
>  int method() return 3;
> }
> int delegate() deleg;
> void main()
> {
>  C c;
>  C2 c2 = new C2;
>  C3 c3 = new C3;
>  c=c2;
>  deleg = &c.method;
>  writefln(deleg()); // 2
>  c=c3;
>  writefln(deleg()); // 2
>  // I expected this to write 3, why is this not so?

Because you didn't reassign deleg.
September 09, 2009
"Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88cck$1orc$1@digitalmars.com...
>
>
> Saaa wrote:
>> abstract class C
>> {
>>  int method();
>> }
>> class C2:C
>> {
>>  int method() return 2;
>> }
>> class C3:C
>> {
>>  int method() return 3;
>> }
>> int delegate() deleg;
>> void main()
>> {
>>  C c;
>>  C2 c2 = new C2;
>>  C3 c3 = new C3;
>>  c=c2;
>>  deleg = &c.method;
>>  writefln(deleg()); // 2
>>  c=c3;
>>  writefln(deleg()); // 2
>>  // I expected this to write 3, why is this not so?
>
> Because you didn't reassign deleg.
but isn't deleg pointing to c's method?


September 09, 2009

Saaa wrote:
> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88cck$1orc$1@digitalmars.com...
>>
>> Saaa wrote:
>>> abstract class C
>>> {
>>>  int method();
>>> }
>>> class C2:C
>>> {
>>>  int method() return 2;
>>> }
>>> class C3:C
>>> {
>>>  int method() return 3;
>>> }
>>> int delegate() deleg;
>>> void main()
>>> {
>>>  C c;
>>>  C2 c2 = new C2;
>>>  C3 c3 = new C3;
>>>  c=c2;
>>>  deleg = &c.method;
>>>  writefln(deleg()); // 2
>>>  c=c3;
>>>  writefln(deleg()); // 2
>>>  // I expected this to write 3, why is this not so?
>> Because you didn't reassign deleg.
> but isn't deleg pointing to c's method?

Yes... just because you change what c points to doesn't magically rewrite all other references.

You might want to read http://digitalmars.com/d/1.0/type.html#delegates
September 09, 2009
Saaa wrote:
> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88cck$1orc$1@digitalmars.com...
>>
>> Saaa wrote:
>>> abstract class C
>>> {
>>>  int method();
>>> }
>>> class C2:C
>>> {
>>>  int method() return 2;
>>> }
>>> class C3:C
>>> {
>>>  int method() return 3;
>>> }
>>> int delegate() deleg;
>>> void main()
>>> {
>>>  C c;
>>>  C2 c2 = new C2;
>>>  C3 c3 = new C3;
>>>  c=c2;

c --> c2.method
        ^
        |
deleg ---

>>>  deleg = &c.method;
>>>  writefln(deleg()); // 2
>>>  c=c3;

Now:

c --> c3.method

      c2.method
        ^
        |
deleg ---

>>>  writefln(deleg()); // 2
>>>  // I expected this to write 3, why is this not so?
>> Because you didn't reassign deleg.
> but isn't deleg pointing to c's method?

Yes, to previous c's method. See above.

Remember that a delegate is a pair: an instance and it's method. You can't just point to a class' method, you are always pointing to a instance's method.

(that's why my arrows point to the dot :-P)
September 09, 2009
"Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88i4n$235l$1@digitalmars.com...
>
>
> Saaa wrote:
>> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88cck$1orc$1@digitalmars.com...
>>>
>>> Saaa wrote:
>>>> abstract class C
>>>> {
>>>>  int method();
>>>> }
>>>> class C2:C
>>>> {
>>>>  int method() return 2;
>>>> }
>>>> class C3:C
>>>> {
>>>>  int method() return 3;
>>>> }
>>>> int delegate() deleg;
>>>> void main()
>>>> {
>>>>  C c;
>>>>  C2 c2 = new C2;
>>>>  C3 c3 = new C3;
>>>>  c=c2;
>>>>  deleg = &c.method;
>>>>  writefln(deleg()); // 2
>>>>  c=c3;
>>>>  writefln(deleg()); // 2
>>>>  // I expected this to write 3, why is this not so?
>>> Because you didn't reassign deleg.
>> but isn't deleg pointing to c's method?
>
> Yes... just because you change what c points to doesn't magically rewrite all other references.
deleg points to c and c points to c2 and later to c3 while deleg still point
to c.
Thus when calling deleg it points to c which now points to c3, thus writing
'3'.
maybe I don't understand what "C c;" and "c=c3;" does?
Isn't c a pointer to a C object?
>
> You might want to read http://digitalmars.com/d/1.0/type.html#delegates
I've read that one a few times now :D


September 09, 2009
"Ary Borenszweig" <ary@esperanto.org.ar> wrote in message news:h88i6o$23hh$1@digitalmars.com...
> Saaa wrote:
>> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message news:h88cck$1orc$1@digitalmars.com...
>>>
>>> Saaa wrote:
>>>> abstract class C
>>>> {
>>>>  int method();
>>>> }
>>>> class C2:C
>>>> {
>>>>  int method() return 2;
>>>> }
>>>> class C3:C
>>>> {
>>>>  int method() return 3;
>>>> }
>>>> int delegate() deleg;
>>>> void main()
>>>> {
>>>>  C c;
>>>>  C2 c2 = new C2;
>>>>  C3 c3 = new C3;
>>>>  c=c2;
>
> c --> c2.method
>         ^
>         |
> deleg ---
>
>>>>  deleg = &c.method;
>>>>  writefln(deleg()); // 2
>>>>  c=c3;
>
> Now:
>
> c --> c3.method
>
>       c2.method
>         ^
>         |
> deleg ---
>
>>>>  writefln(deleg()); // 2
>>>>  // I expected this to write 3, why is this not so?
>>> Because you didn't reassign deleg.
>> but isn't deleg pointing to c's method?
>
> Yes, to previous c's method. See above.
>
> Remember that a delegate is a pair: an instance and it's method. You can't just point to a class' method, you are always pointing to a instance's method.
>
> (that's why my arrows point to the dot :-P)

Ok, disregard my last comment :D
How should I do this then?


September 09, 2009
Saaa wrote:
> Ok, disregard my last comment :D
> How should I do this then?

class Foo
{
  C* c;

  this(ref C c)
  {
    this.c = &c;
  }

  int invoke()
  {
    return (*c).method();
  }
}

void main()
{
  // ...
  deleg = &(new Foo(c)).invoke;
}

Or something similar.

This is dangerous.  Do not allow either the Foo instance or the delegate to survive past the end of c's scope.

It is simpler and safer to just update the delegate.
September 09, 2009
>
> class Foo
> {
>  C* c;
>
>  this(ref C c)
>  {
>    this.c = &c;
>  }
>
>  int invoke()
>  {
>    return (*c).method();
>  }
> }
>
> void main()
> {
>  // ...
>  deleg = &(new Foo(c)).invoke;
> }
>
> Or something similar.
>
> This is dangerous.  Do not allow either the Foo instance or the delegate to survive past the end of c's scope.
>
> It is simpler and safer to just update the delegate.
Thanks!


September 09, 2009
Hello Saaa,

> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message
> news:h88i4n$235l$1@digitalmars.com...
> 
>> Saaa wrote:
>> 
>>> "Daniel Keep" <daniel.keep.lists@gmail.com> wrote in message
>>> news:h88cck$1orc$1@digitalmars.com...
>>> 
>>>> Saaa wrote:
>>>> 
>>>>> abstract class C
>>>>> {
>>>>> int method();
>>>>> }
>>>>> class C2:C
>>>>> {
>>>>> int method() return 2;
>>>>> }
>>>>> class C3:C
>>>>> {
>>>>> int method() return 3;
>>>>> }
>>>>> int delegate() deleg;
>>>>> void main()
>>>>> {
>>>>> C c;
>>>>> C2 c2 = new C2;
>>>>> C3 c3 = new C3;
>>>>> c=c2;
>>>>> deleg = &c.method;
>>>>> writefln(deleg()); // 2
>>>>> c=c3;
>>>>> writefln(deleg()); // 2
>>>>> // I expected this to write 3, why is this not so?
>>>> Because you didn't reassign deleg.
>>>> 
>>> but isn't deleg pointing to c's method?
>>> 
>> Yes... just because you change what c points to doesn't magically
>> rewrite all other references.
>> 
> deleg points to c and c points to c2 and later to c3 while deleg still
> point to c.
> Thus when calling deleg it points to c which now points to c3, thus
> writing '3'.

deleg dosn't have pointer to c, it has a pointer to an object, that is a /copy/ of the reference c.


« First   ‹ Prev
1 2