digitalmars.D - is private broken?
- Jonathan Marler (37/37) Oct 10 2017 On windows I was able to compile the following using both
- Steven Schveighoffer (5/10) Oct 10 2017 Before I even read your code, I was pretty sure the error :)
- Jonathan Marler (5/15) Oct 10 2017 Wow I can't believe I've gone this long not realizing that. I'm
- Jonathan M Davis (9/28) Oct 10 2017 There is - by putting them in a separate module. It was done this way to
- jmh530 (3/7) Oct 10 2017 I hadn't realized this was the reason for it. Makes sense.
- Jonathan M Davis (8/16) Oct 10 2017 LOL. Same here. It seems like almost everyone makes this mistake unless ...
- Steven Schveighoffer (4/21) Oct 10 2017 Yeah, if you look back far enough in the forums, I'm pretty sure I
- Seb (6/25) Oct 10 2017 FWIW this confusion found it's way into Phobos as the unittest
- w0rp (2/5) Oct 10 2017 You can access private attributes anywhere in the same module.
- Steven Schveighoffer (2/2) Oct 10 2017 Hah! Beat you by 10 seconds :)
On windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something? I find it hard to believe that a bug of this magnitudue could have been introduced and not been noticed for so long. Does this compile on other people's systems as well? import std.stdio; struct SomeStruct { private int privateValue; private void privateFunction() { } } class SomeClass { private int privateValue; private void privateFunction() { } } void main() { auto someStruct = SomeStruct(42); writefln("someStruct.privateValue = %s", someStruct.privateValue); someStruct.privateFunction(); auto someStructRef = new SomeStruct(42); writefln("someStructRef.privateValue = %s", someStructRef.privateValue); someStruct.privateFunction(); auto someClass = new SomeClass(); writefln("someClass.privateValue = %s", someClass.privateValue); someClass.privateFunction(); }
Oct 10 2017
On 10/10/17 3:20 PM, Jonathan Marler wrote:On windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :) private is module-based, not type based. Put your structs in a different module, and private will work. -Steve
Oct 10 2017
On Tuesday, 10 October 2017 at 19:33:30 UTC, Steven Schveighoffer wrote:On 10/10/17 3:20 PM, Jonathan Marler wrote:Wow I can't believe I've gone this long not realizing that. I'm surprised there's not a way to make fields private to their own struct/class.On windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :) private is module-based, not type based. Put your structs in a different module, and private will work. -Steve
Oct 10 2017
On Tuesday, October 10, 2017 19:50:49 Jonathan Marler via Digitalmars-d wrote:On Tuesday, 10 October 2017 at 19:33:30 UTC, Steven Schveighoffer wrote:There is - by putting them in a separate module. It was done this way to avoid the extra complication of friend functions that you get in C++, and the theory is that you're in control of everything that's in your own module, so you should be able to deal with not having stuff access stuff in the same module when it shouldn't. And if you want nothing outside the type to have access, just stick the type in its own module. - Jonathan M DavisOn 10/10/17 3:20 PM, Jonathan Marler wrote:Wow I can't believe I've gone this long not realizing that. I'm surprised there's not a way to make fields private to their own struct/class.On windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :) private is module-based, not type based. Put your structs in a different module, and private will work. -Steve
Oct 10 2017
On Tuesday, 10 October 2017 at 19:59:05 UTC, Jonathan M Davis wrote:There is - by putting them in a separate module. It was done this way to avoid the extra complication of friend functions that you get in C++, and the theory is that you're in control of everything that's in your own module, [snip]I hadn't realized this was the reason for it. Makes sense.
Oct 10 2017
On Tuesday, October 10, 2017 15:33:30 Steven Schveighoffer via Digitalmars-d wrote:On 10/10/17 3:20 PM, Jonathan Marler wrote:LOL. Same here. It seems like almost everyone makes this mistake unless they caught the information first by doing something like reading the spec carefully or reading TDPL. And if you always treat your types as if nothing else can access their private members and don't need the equivalent of a C++ friend function, odds are, that you'll never notice... - Jonathan M DavisOn windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :)
Oct 10 2017
On 10/10/17 4:02 PM, Jonathan M Davis wrote:On Tuesday, October 10, 2017 15:33:30 Steven Schveighoffer via Digitalmars-d wrote:Yeah, if you look back far enough in the forums, I'm pretty sure I posted a message similar to Mr. Marler's about this shocking revelation :) -SteveOn 10/10/17 3:20 PM, Jonathan Marler wrote:LOL. Same here. It seems like almost everyone makes this mistake unless they caught the information first by doing something like reading the spec carefully or reading TDPL. And if you always treat your types as if nothing else can access their private members and don't need the equivalent of a C++ friend function, odds are, that you'll never notice...On windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :)
Oct 10 2017
On Tuesday, 10 October 2017 at 20:02:32 UTC, Jonathan M Davis wrote:On Tuesday, October 10, 2017 15:33:30 Steven Schveighoffer via Digitalmars-d wrote:FWIW this confusion found it's way into Phobos as the unittest was in the same module: https://dlang.org/phobos/std_traits.html#getSymbolsByUDA See also: https://issues.dlang.org/show_bug.cgi?id=17643On 10/10/17 3:20 PM, Jonathan Marler wrote:LOL. Same here. It seems like almost everyone makes this mistake unless they caught the information first by doing something like reading the spec carefully or reading TDPL. And if you always treat your types as if nothing else can access their private members and don't need the equivalent of a C++ friend function, odds are, that you'll never notice... - Jonathan M DavisOn windows I was able to compile the following using both dmd.2.075.1 and dmd.2.076.1 From what I understand, you shouldn't be able to access private fields/methods like this...am I missing something?Before I even read your code, I was pretty sure the error :)
Oct 10 2017
https://wiki.dlang.org/Access_specifiers_and_visibility#privatePrivate means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class.You can access private attributes anywhere in the same module.
Oct 10 2017
Hah! Beat you by 10 seconds :) -Steve
Oct 10 2017