|
||
The CCoeStatic
class allows singleton classes to be
created and stored by the environmnent (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 ) ;