Singleton Pattern with struct

Era Scarecrow rtcvb32 at yahoo.com
Thu Jan 24 08:17:33 PST 2013


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]


More information about the Digitalmars-d-learn mailing list