On Thursday, 24 January 2013 at 14:11:10 UTC, ParticlePeter wrote:
Hi,
I am trying to figure out the singleton pattern with a struct
instead of a class:
[code]
struct Singleton {
private :
this( int a = 0 ) {} ;
static Singleton * s ;
public :
@disable this() ;
static ref Singleton instance() {
if ( s is null )
s = new Singleton( 0 ) ;
return * s ;
}
int val = 0 ;
}
[/code]
This compiles, but when I use it:
[code]
auto s = Singleton.instance ;
writeln( s.val ) ;
Singleton.instance.val = 2 ;
writeln( s.val ) ;
[/code]
I get:
0
0
Where is my mistake ?
Cheers, PP !
Even if Singleton.instance returns by ref, s object is still
stack-allocated struct, which is not affected by further
modification of private pointer.
import core.stdc.stdio : printf;
struct Singleton {
private :
this( int a = 0 ) {} ;
static Singleton * s ;
public :
@disable this() ;
static ref Singleton instance() {
if ( s is null )
s = new Singleton(0) ;
return * s ;
}
int val = 0 ;
}
void main()
{
auto s = Singleton.instance ;
printf( "%d\n", s.val ) ; //0
Singleton.instance.val = 2 ;
printf( "%d\n", s.val ) ; // also 0
printf( "%d\n", Singleton.instance.val); // is 2 as expected
}