The CCoeStatic
class allows singleton classes to be
created and stored by the environment (CCoeEnv
) in Thread
Local Storage (TLS). This provides a means of creating writeable global static
data.
MySingleton.h
class CMySingleton : public CCoeStatic { public: static CMySingleton* SelfL() ; // Slightly slower static CMySingleton* SelfL( CCoeEnv* aCoeEnv ) ; // Slightly faster ... private: CMySingleton() ; ~CMySingleton() ; } ;
MySingleton.cpp
const TUid KUidMySingleton = {0x10204232} ; CMySingleton::CMySingleton() : CCoeStatic( KUidMySingleton, CCoeStatic::EThread /*or EApp*/ ) { } CMySingleton* CMySingleton::SelfL() { CMySingleton* self = static_cast<CMySingleton*>( CCoeStatic::Static( KUidMySingleton ) ) ; if(!self) { self = new( ELeave ) CMySingleton() ; } return self ; } CMySingleton* CMySingleton::SelfL( CCoeEnv* aCoeEnv ) { CMySingleton* self = static_cast<CMySingleton*>( aCoeEnv->FindStatic( KUidMySingleton ) ) ; if( !self ) { self = new( ELeave ) CMySingleton() ; } return self ; }
A singleton must be given a UID. When it is instantiated for the first time the base class constructor adds it to the list of singletons in the environment. Any subsequent attempts to instantiate the same singleton will result in a panic.
Singletons may be given a destruction priority and a scope.
The destruction priority determines when the singleton is destroyed
relative to any other singletons in the environment's list and relative to
the App Ui. The default priority, EDefaultDestructionPriority
,
is 100. The higher the priority, the earlier the singleton will be destroyed.
A negative value indicates that the singleton should be destroyed after the
AppUi. The more negative the value, the later the destruction.
The scope may be EThread
(the default) or EApp
and
determines the visibility of the singleton.
Once a singleton has been created it may be accessed through the CCoeEnv
API.
// Singleton access IMPORT_C static CCoeStatic* Static( TUid aUid ) ; IMPORT_C CCoeStatic* FindStatic( TUid aUid ) ;