Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Uriel | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lars Kyllingstad | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Aarti_pl | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Uriel | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bruno Medeiros | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sergey Gromov | 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 |
Copyright © 1999-2021 by the D Language Foundation