local class instance (at module-level)
Alex
sascha.orlov at gmail.com
Thu Mar 14 12:05:48 UTC 2019
On Thursday, 14 March 2019 at 11:05:22 UTC, spir wrote:
> I desperately try to declare/define/initialise a simple class
> instance at module-level. This is a special (conceptually
> static and immutable) instance used as a "marker", that just
> should exist and be accessible by methods of this class and/or
> other classes defined in the same module. (Thus I don't care if
> TLS.) I use it as a remplacement for null, to avoid semantic
> confusion and unhelpful segfaults in case of bug.
>
> I have tried a number of options and never manage to do it,
> including:
> * [C/auto/static immutable c0] = new C(0) ;
> * C c0 ; c0.i = 0 ;
> * defining a static this()
> * more...
>
> The most confusing error is:
> Error: variable `_base.c0` is a thread-local class and cannot
> have a static initializer. Use `static this()` to initialize
> instead.
>
> I also could not find any information --for a while,
> repeatedly, since I can go on developing in the meantime, using
> null instead. I'm bluffed and confused, since there is nothing
> weird in that, is there? (the compiler can just allocate it in
> static mem and take the address)
>
> Reduced test case:
> ===========================
> class C {
> uint i ;
> this (uint i) {
> this.i = i ;
> }
> }
>
> // error
> auto c0 = new C(0) ;
>
> void main () {
> // ok
> auto c0 = new C(0) ;
> }
> ===========================
>
> I would enjoy an explanation (or a pointer to) in addition to a
> solution.
>
> Thank you,
> diniz
>
> PS: I take the opportnity to ask if I can count on the compiler
> to intern literal strings (which my code may use in several
> places, including loops), esp. "", or should I declare and use
> (for instance):
> static immutable s0 = "" ;
Basically, this works for me:
´´´
class C {
uint i ;
this (uint i) {
this.i = i ;
}
}
C c0;
static this()
{
c0 = new C(0);
}
void main () {
assert(!(c0 is null));
}
´´´
More information about the Digitalmars-d-learn
mailing list