Singleton Pattern with struct

Maxim Fomin maxim at maxim-fomin.ru
Thu Jan 24 08:49:52 PST 2013


On Thursday, 24 January 2013 at 16:17:34 UTC, Era Scarecrow wrote:
> On Thursday, 24 January 2013 at 16:07:36 UTC, Maxim Fomin wrote:
>> Yes, but this can be broken by:
>
>> void main()
>> {
>>        Singleton s = * Singleton.instance;
>>        printf( "%d\n", s.val ) ; //
>>        Singleton.instance.val = 2 ;
>>        printf( "%d\n", s.val ) ; //0
>> }
>>
>> Here s is explicitly defined to be a struct object, not 
>> pointer (reference), so main.s is independent of further 
>> modification of Singleton.instance.
>
>  I'm not sure but this seems like one of the few appropriate 
> places i would just make a normal struct and just use a global 
> variable. True there could 'be' multiple instances of these 
> singletons, but only ever making one ensures it would work 
> right so long as you cannot copy it. Wasn't disabling 
> this(this) and opAssign the way to ensure that didn't happen?
>
>  Course if you didn't and you relied on the instance one, and 
> you cannot copy then you could only pass by reference or be 
> required to use .instance every time you needed it. Seems a bit 
> excessive.
>
>
>  Hmmm. You could separate the data and remove the pointer... 
> then use alias this.
>
> [code]
>   struct Singleton {
>     static SingletonData single;
>     alias single this;
>     @disable this(this);
>     //disable copy/assignment? Not that it would matter...
>     //copying nothing does nothing, as there's nothing here.
>
>     private static struct SingletonData {
>       //methods and data here.
>     }
>  [/code]

I agree, but disabling ctors makes creating module-level object 
tricky. Static struct initialization might help.


More information about the Digitalmars-d-learn mailing list