Thread overview
Sturcts with constructor (dmd1.x)
Jan 11, 2010
Nrgyzer
Jan 11, 2010
dsimcha
Jan 11, 2010
bearophile
Jan 12, 2010
grauzone
Jan 12, 2010
bearophile
Jan 11, 2010
Ellery Newcomer
January 11, 2010
Hello everyone,

I currently try to create a structure with a construtor, but I always get the following messages:

Error: Foo.this constructors are only for class definitions
Error: constructor lisim.lsResult.lsResult.this special member functions not allowed for structs

By compiling the follwing code:

struct Foo {
    int len;
    bool len_done;
    const char* str;
    int length()
    {   if (!len_done)
        {   len = strlen(str);
	    len_done = true;
        }
	return len;
    }
    this(char* str) { this.str = str; }
}
const Foo f = Foo("hello");
bar(f.length);

I found that source on http://www.digitalmars.com/d/2.0/const-faq.html#logical-const. I know that this source is for d2 and not for d1 but does d1 support similar operations (or is there no support for struct-constructors)?

Thanks in advance :)
January 11, 2010
== Quote from Nrgyzer (nrgyzer@googlemail.com)'s article
> Hello everyone,
> I currently try to create a structure with a construtor, but I always get the
following messages:
> Error: Foo.this constructors are only for class definitions
> Error: constructor lisim.lsResult.lsResult.this special member functions not
allowed for structs
> By compiling the follwing code:
> struct Foo {
>     int len;
>     bool len_done;
>     const char* str;
>     int length()
>     {   if (!len_done)
>         {   len = strlen(str);
> 	    len_done = true;
>         }
> 	return len;
>     }
>     this(char* str) { this.str = str; }
> }
> const Foo f = Foo("hello");
> bar(f.length);
> I found that source on
http://www.digitalmars.com/d/2.0/const-faq.html#logical-const. I know that this source is for d2 and not for d1 but does d1 support similar operations (or is there no support for struct-constructors)?
> Thanks in advance :)

Struct constructors are D2 only.  That said, you can fake them in D1 by overloading static opCall:

struct Foo {
    uint field;

    static Foo opCall(SomeType someArgument) {
        Foo foo;

        // Do stuff.
        foo.field = someValue;
        return foo;
    }
}

auto foo = Foo(someArgument);
January 11, 2010
On 01/11/2010 04:06 PM, Nrgyzer wrote:
> Hello everyone,
>
> I currently try to create a structure with a construtor, but I always get the following messages:
>
> Error: Foo.this constructors are only for class definitions
> Error: constructor lisim.lsResult.lsResult.this special member functions not allowed for structs
>
> By compiling the follwing code:
>
> struct Foo {
>      int len;
>      bool len_done;
>      const char* str;
>      int length()
>      {   if (!len_done)
>          {   len = strlen(str);
> 	    len_done = true;
>          }
> 	return len;
>      }
>      this(char* str) { this.str = str; }
> }
> const Foo f = Foo("hello");
> bar(f.length);
>
> I found that source on http://www.digitalmars.com/d/2.0/const-faq.html#logical-const. I know that this source is for d2 and not for d1 but does d1 support similar operations (or is there no support for struct-constructors)?
>
> Thanks in advance :)

get rid of the constructor and replace

> const Foo f = Foo("hello");

with

const Foo f = Foo(0,false,"hello");

and it will work, if you can forgive how ugly it is.
January 11, 2010
dsimcha:
> Struct constructors are D2 only.  That said, you can fake them in D1 by overloading static opCall:

Struct constructors are probably the D2 feature I miss more in D1 :-)

Bye,
bearophile
January 12, 2010
bearophile wrote:
> dsimcha:
>> Struct constructors are D2 only.  That said, you can fake them in D1 by
>> overloading static opCall:
> 
> Struct constructors are probably the D2 feature I miss more in D1 :-)

Why?

> Bye,
> bearophile
January 12, 2010
grauzone:
> > Struct constructors are probably the D2 feature I miss more in D1 :-)
> 
> Why?

During optimization phases I sometimes want to convert classes into structs, and then I want to allocate some of those struct instances on the heap and others on the stack. A struct constructor allows me to change as little as possible to the code that uses those new structs.

Bye,
bearophile