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
}

Reply via email to