www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Static members and access attribute

reply Uriel <uriel inbox.ru> writes:
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?
Oct 22 2008
next sibling parent reply Lars Kyllingstad <public kyllingen.NOSPAMnet> writes:
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
Oct 22 2008
parent reply Aarti_pl <aarti interia.pl> writes:
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)
Oct 22 2008
parent Lars Kyllingstad <public kyllingen.NOSPAMnet> writes:
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
Oct 22 2008
prev sibling parent reply Bruno Medeiros <brunodomedeiros+spam com.gmail> writes:
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
Oct 24 2008
parent reply Sergey Gromov <snake.scaly gmail.com> writes:
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.
Oct 24 2008
parent Bruno Medeiros <brunodomedeiros+spam com.gmail> writes:
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?

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
Oct 24 2008