Thread overview
Static members and access attribute
Oct 22, 2008
Uriel
Oct 22, 2008
Lars Kyllingstad
Oct 22, 2008
Aarti_pl
Oct 22, 2008
Lars Kyllingstad
Oct 24, 2008
Bruno Medeiros
Oct 24, 2008
Sergey Gromov
Oct 24, 2008
Bruno Medeiros
October 22, 2008
I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.

module a;

class A
{
    private static int Foo;
}

import std.stdio;

import a;

void main()
{
    A.Foo = 1;
    writeln(A.Foo);

/*
    A obj = new A();
    obj.Foo = 2;
    writeln(A.Foo);
*/
}

Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
Is this a bug?
October 22, 2008
Uriel wrote:
> I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
> 
> module a;
> 
> class A
> {
>     private static int Foo;
> }
> 
> import std.stdio;
> 
> import a;
> 
> void main()
> {
>     A.Foo = 1;
>     writeln(A.Foo);
> 
> /*        A obj = new A();
>     obj.Foo = 2;
>     writeln(A.Foo);
> */
> }
> 
> Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
> Is this a bug?

No, that's the way it should be. You get the error because of the line

  obj.Foo = 2;

Foo is not available for instances of A. There is only one (global) Foo, namely A.Foo. That's what static means.

-Lars
October 22, 2008
Lars Kyllingstad pisze:
> Uriel wrote:
>> I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
>>
>> module a;
>>
>> class A
>> {
>>     private static int Foo;
>> }
>>
>> import std.stdio;
>>
>> import a;
>>
>> void main()
>> {
>>     A.Foo = 1;
>>     writeln(A.Foo);
>>
>> /*        A obj = new A();
>>     obj.Foo = 2;
>>     writeln(A.Foo);
>> */
>> }
>>
>> Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
>> Is this a bug?
> 
> No, that's the way it should be. You get the error because of the line
> 
>   obj.Foo = 2;
> 
> Foo is not available for instances of A. There is only one (global) Foo, namely A.Foo. That's what static means.
> 
> -Lars

I am not sure about what you say... In Java you can access static members through objects - you get just warnings. As I said I am not sure how it is supposed to be in D.

According to accessing private static member from another module - it is bug. Its already in bugzilla.

BR
Marcin Kuszczak
(aarti_pl)
October 22, 2008
Aarti_pl wrote:
> Lars Kyllingstad pisze:
>> Uriel wrote:
>>> I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
>>>
>>> module a;
>>>
>>> class A
>>> {
>>>     private static int Foo;
>>> }
>>>
>>> import std.stdio;
>>>
>>> import a;
>>>
>>> void main()
>>> {
>>>     A.Foo = 1;
>>>     writeln(A.Foo);
>>>
>>> /*        A obj = new A();
>>>     obj.Foo = 2;
>>>     writeln(A.Foo);
>>> */
>>> }
>>>
>>> Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
>>> Is this a bug?
>>
>> No, that's the way it should be. You get the error because of the line
>>
>>   obj.Foo = 2;
>>
>> Foo is not available for instances of A. There is only one (global) Foo, namely A.Foo. That's what static means.
>>
>> -Lars
> 
> I am not sure about what you say... In Java you can access static members through objects - you get just warnings. As I said I am not sure how it is supposed to be in D.
> 
> According to accessing private static member from another module - it is bug. Its already in bugzilla.

OK, I didn't know that. Uriel, don't listen to me. :)

-Lars
October 24, 2008
Uriel wrote:
> I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
> 
> module a;
> 
> class A
> {
>     private static int Foo;
> }
> 
> import std.stdio;
> 
> import a;
> 
> void main()
> {
>     A.Foo = 1;
>     writeln(A.Foo);
> 
> /*        A obj = new A();
>     obj.Foo = 2;
>     writeln(A.Foo);
> */
> }
> 
> Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
> Is this a bug?

No, Foo is private, so you can't access it outside of the module where it is defined (module a).

-- 
Bruno Medeiros - Software Developer, MSc. in CS/E graduate
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
October 24, 2008
Fri, 24 Oct 2008 13:05:00 +0100,
Bruno Medeiros wrote:
> Uriel wrote:
> > I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
> > 
> > module a;
> > 
> > class A
> > {
> >     private static int Foo;
> > }
> > 
> > import std.stdio;
> > 
> > import a;
> > 
> > void main()
> > {
> >     A.Foo = 1;
> >     writeln(A.Foo);
> > 
> > /*
> >     A obj = new A();
> >     obj.Foo = 2;
> >     writeln(A.Foo);
> > */
> > }
> > 
> > Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
> > Is this a bug?
> 
> No, Foo is private, so you can't access it outside of the module where it is defined (module a).

Of course it's not a bug that the commented-out part fails.  It's a bug that the first part of main() works.
October 24, 2008
Sergey Gromov wrote:
> Fri, 24 Oct 2008 13:05:00 +0100,
> Bruno Medeiros wrote:
>> Uriel wrote:
>>> I've found some strange behaviour with static members and haven't noticed anything about it in the documentation.
>>>
>>> module a;
>>>
>>> class A
>>> {
>>>     private static int Foo;
>>> }
>>>
>>> import std.stdio;
>>>
>>> import a;
>>>
>>> void main()
>>> {
>>>     A.Foo = 1;
>>>     writeln(A.Foo);
>>>
>>> /*        A obj = new A();
>>>     obj.Foo = 2;
>>>     writeln(A.Foo);
>>> */
>>> }
>>>
>>> Program will compile and print '1'. But if uncomment the second part of code compiler will say that "class a.A member Foo is not accessible".
>>> Is this a bug?
>> No, Foo is private, so you can't access it outside of the module where it is defined (module a).
> 
> Of course it's not a bug that the commented-out part fails.  It's a bug that the first part of main() works.

Ah, duh, didn't notice that part, I agree.

-- 
Bruno Medeiros - Software Developer, MSc. in CS/E graduate
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D