View mode: basic / threaded / horizontal-split · Log in · Help
October 22, 2008
Static members and access attribute
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
Re: Static members and access attribute
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
Re: Static members and access attribute
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
Re: Static members and access attribute
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
Re: Static members and access attribute
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
Re: Static members and access attribute
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
Re: Static members and access attribute
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
Top | Discussion index | About this forum | D home