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








JMRyan <nospam nospam.com>