digitalmars.D.learn - struct and class member alias
- Stuart Murray (38/38) Jun 05 2007 In the following, the aliases have no apparent effect (although they do ...
- Jarrett Billingsley (42/48) Jun 05 2007 It doesn't compile; I get
- Stuart Murray (15/79) Jun 05 2007 Interesting that it doesn't compile for you.. It definitely does for me ...
- Jarrett Billingsley (10/25) Jun 06 2007 Oh, well _that_ will compile :) It's because "A.foo" is not an expressi...
- Stuart Murray (4/48) Jun 06 2007 Thanks, that all seems to make sense. Thanks a lot for your help.
- Jarrett Billingsley (4/20) Jun 06 2007 _Everyone_ does. But "this is the way C++ does it," as if that means
In the following, the aliases have no apparent effect (although they do compile). Is there a way to achieve a similar effect? I just want to be able to access boxInstance.pos.x using boxInstance.x I got the alias idea from the function page in the documentation: http://digitalmars.com/d/function.html under Function Inheritance and Overloading obviously it doesn't describe the same thing, but I figured I'd give it a shot. Given that it doesn't seem to work I was thinking that it might be a handy feature to have in the language? I tried this as a struct(suitably modified) also. public class Coord { int x, y; this (in int x, in int y) { this.x = x; this.y = y; } } public class Box { Coord pos, size; alias pos.x x; alias pos.y y; alias size.x w; alias size.y h; this (in int x, in int y, in int w, in int h) { pos = new Coord(x, y); size = new Coord(w, h); } }
Jun 05 2007
"Stuart Murray" <stuart.w.murray fakey.nospambots.gmail.com> wrote in message news:f4430d$14oc$1 digitalmars.com...In the following, the aliases have no apparent effect (although they do compile). Is there a way to achieve a similar effect? I just want to be able to access boxInstance.pos.x using boxInstance.xIt doesn't compile; I get foo.d(19): Error: pos.x is used as a type foo.d(20): Error: pos.y is used as a type foo.d(21): Error: size.x is used as a type foo.d(22): Error: size.y is used as a type It's no surprise, either. You're not allowed to make aliases of expressions. What you can do is make "properties." You have a setter and a getter for each property. Because of some syntactic sugar, you can write "a.x" to mean "a.x()" and "a.x = 5" to mean "a.x(5)". Here's the Box class with read/write properties for x and y defined. public class Box { Coord pos, size; this(in int x, in int y, in int w, in int h) { pos = new Coord(x, y); size = new Coord(w, h); } public int x() { return pos.x; } public void x(int val) { pos.x = val; } public int y() { return pos.y; } public void y(int val) { pos.y = val; } } It's a little more verbose than you might like. Another solution would be to make public reference fields in Box that refer to the inner pos.x, pos.y etc. members. But D doesn't have generic reference types, so foo :(
Jun 05 2007
Jarrett Billingsley Wrote:"Stuart Murray" <stuart.w.murray fakey.nospambots.gmail.com> wrote in message news:f4430d$14oc$1 digitalmars.com...Interesting that it doesn't compile for you.. It definitely does for me (using DMD v1.014) This is the example I referred to, if anyones interested: class A { int foo(int x) { ... } int foo(long y) { ... } } class B : A { alias A.foo foo; override int foo(long x) { ... } } Its in the documentation. As I said, it's slightly different thing, but it seems to .. *match*.. It is unfortunate to not have reference types a la C++, but I love D in almost every other way :)In the following, the aliases have no apparent effect (although they do compile). Is there a way to achieve a similar effect? I just want to be able to access boxInstance.pos.x using boxInstance.xIt doesn't compile; I get foo.d(19): Error: pos.x is used as a type foo.d(20): Error: pos.y is used as a type foo.d(21): Error: size.x is used as a type foo.d(22): Error: size.y is used as a type It's no surprise, either. You're not allowed to make aliases of expressions. What you can do is make "properties." You have a setter and a getter for each property. Because of some syntactic sugar, you can write "a.x" to mean "a.x()" and "a.x = 5" to mean "a.x(5)". Here's the Box class with read/write properties for x and y defined. public class Box { Coord pos, size; this(in int x, in int y, in int w, in int h) { pos = new Coord(x, y); size = new Coord(w, h); } public int x() { return pos.x; } public void x(int val) { pos.x = val; } public int y() { return pos.y; } public void y(int val) { pos.y = val; } } It's a little more verbose than you might like. Another solution would be to make public reference fields in Box that refer to the inner pos.x, pos.y etc. members. But D doesn't have generic reference types, so foo :(
Jun 05 2007
"Stuart Murray" <stuart.w.murray fakey.nospambots.gmail.com> wrote in message news:f458q0$2vea$1 digitalmars.com...Interesting that it doesn't compile for you.. It definitely does for me (using DMD v1.014) This is the example I referred to, if anyones interested: class A { int foo(int x) { ... } int foo(long y) { ... } } class B : A { alias A.foo foo; override int foo(long x) { ... } } Its in the documentation. As I said, it's slightly different thing, but it seems to .. *match*..Oh, well _that_ will compile :) It's because "A.foo" is not an expression, it's a symbol. You're saying "bring my superclass's implementation of foo into this namespace so it can be overloaded." A.foo is a name, so you can alias it. The "A." is just there as a marker to say where foo lives. In your example, pos and size are class instances; they have no meaning until they've been new'ed. Furthermore, pos.x is not a symbol, it's an expression -- it's an access to a member whose location can't be determined at compile time. So, you can't alias it.
Jun 06 2007
Jarrett Billingsley Wrote:"Stuart Murray" <stuart.w.murray fakey.nospambots.gmail.com> wrote in message news:f458q0$2vea$1 digitalmars.com...Thanks, that all seems to make sense. Thanks a lot for your help. As a last note I would suggest that the example:Interesting that it doesn't compile for you.. It definitely does for me (using DMD v1.014) This is the example I referred to, if anyones interested: class A { int foo(int x) { ... } int foo(long y) { ... } } class B : A { alias A.foo foo; override int foo(long x) { ... } } Its in the documentation. As I said, it's slightly different thing, but it seems to .. *match*..Oh, well _that_ will compile :) It's because "A.foo" is not an expression, it's a symbol. You're saying "bring my superclass's implementation of foo into this namespace so it can be overloaded." A.foo is a name, so you can alias it. The "A." is just there as a marker to say where foo lives. In your example, pos and size are class instances; they have no meaning until they've been new'ed. Furthermore, pos.x is not a symbol, it's an expression -- it's an access to a member whose location can't be determined at compile time. So, you can't alias it.seems a bit of a hacky way to fix the overload choosing thing, I suspect most newcomers would assume that subclass member functions would overload with superclass members of the same name. But such is life.class A { int foo(int x) { ... } int foo(long y) { ... } } class B : A { alias A.foo foo; override int foo(long x) { ... } }
Jun 06 2007
"Stuart Murray" <stuart.w.murray fakey.nospambots.gmail.com> wrote in message news:f46eg2$1qce$1 digitalmars.com...Thanks, that all seems to make sense. Thanks a lot for your help. As a last note I would suggest that the example:_Everyone_ does. But "this is the way C++ does it," as if that means anything. *sigh*seems a bit of a hacky way to fix the overload choosing thing, I suspect most newcomers would assume that subclass member functions would overload with superclass members of the same name. But such is life.class A { int foo(int x) { ... } int foo(long y) { ... } } class B : A { alias A.foo foo; override int foo(long x) { ... } }
Jun 06 2007