digitalmars.D - New structs
- JMRyan (23/23) Sep 10 2010 Consider this uninspiring pair structs:
- Andrej Mitrovic (8/31) Sep 10 2010 Is this D1 code? Because in D2:
- Steven Schveighoffer (7/14) Sep 10 2010 I think it was a typo. He meant
- JMRyan (6/15) Sep 10 2010 Yes, and the comment repeated the same typo. The whole line
Consider this uninspiring pair structs: struct S1 {int x}; struct S2 { int x this(int i) {x = i} }; Note that no default constructor is allowed so that S2.init can have a consistent value computed at compile time. Now: S1 a = S1(); // Quintessinal case works fine S2 b = S2(); // Also works, D initializes b with S2.init S2* c = new S1(); // Works, D initializes c* with S2.init S2* d = new S2(); // Doesn't work: no default consructor Instead of the last, we need: S2* d = cast(S2*) GC.malloc(S2.sizeof); d = S2(); // or: d = S2.init; Is there any good reason why "S2* d = new S2();" shouldn't be allowed? If allowed, D could initialize d* with S2.init. S2 really isn't needed since S1(3) and S2(3) have the same effect. Also, a final class would at least usually be just as good as a struct here. But still, disallowing "S2* d = new S2();" seems decidedly unnecessary, especially since "S2 b = S2();" already works.
Sep 10 2010
Is this D1 code? Because in D2: S2* c =3D new S1(); // Error: cannot implicitly convert expression (new S1) of type S1* to S2* S2* d =3D cast(S2*) GC.malloc(S2.sizeof); d =3D S2(); // Error: cannot implicitly convert expression (S2(0)) of type S2 to S2* Neither of those work. On Fri, Sep 10, 2010 at 7:27 PM, JMRyan <nospam nospam.com> wrote:Consider this uninspiring pair structs: struct S1 {int x}; struct S2 { =A0 =A0int x =A0 =A0this(int i) {x =3D i} }; Note that no default constructor is allowed so that S2.init can have a consistent value computed at compile time. Now: S1 a =3D S1(); =A0 =A0 =A0 // Quintessinal case works fine S2 b =3D S2(); =A0 =A0 =A0 // Also works, D initializes b with S2.init S2* c =3D new S1(); =A0// Works, D initializes c* with S2.init S2* d =3D new S2(); =A0// Doesn't work: no default consructor Instead of the last, we need: S2* d =3D cast(S2*) GC.malloc(S2.sizeof); d =3D S2(); =A0// or: d =3D S2.init; Is there any good reason why "S2* d =3D new S2();" shouldn't be allowed? If allowed, D could initialize d* with S2.init. S2 really isn't needed since S1(3) and S2(3) have the same effect. Also, a final class would at least usually be just as good as a struct here. =A0But still, disallowing "S2* d =3D new S2();" seems decidedly unnecessary, especially since "S2 b =3D S2();" already works.
Sep 10 2010
On Fri, 10 Sep 2010 13:55:37 -0400, Andrej Mitrovic <andrej.mitrovich gmail.com> wrote:Is this D1 code? Because in D2: S2* c = new S1(); // Error: cannot implicitly convert expression (new S1) of type S1* to S2* S2* d = cast(S2*) GC.malloc(S2.sizeof); d = S2(); // Error: cannot implicitly convert expression (S2(0)) of type S2 to S2* Neither of those work.I think it was a typo. He meant S1* c = new S1() BTW, I filed a bug report on this a while back: http://d.puremagic.com/issues/show_bug.cgi?id=4247 -Steve
Sep 10 2010
"Steven Schveighoffer" <schveiguy yahoo.com> wrote in news:op.vitwqwoveav7ka localhost.localdomain:I think it was a typo. He meant S1* c = new S1() BTW, I filed a bug report on this a while back: http://d.puremagic.com/issues/show_bug.cgi?id=4247 -SteveYes, and the comment repeated the same typo. The whole line should have read: S1* c = new S1(); // Works, D initializes c* with S1.init I just voted for your bug report.
Sep 10 2010