下面這個是基於Noka 中的"tip of this month"中提供的一個例子而實現singleton的另外一種方式:
#include <coemain.h>
template<class T>
class DefaultCreator
{
public:
static T * Create()
{
return new (ELeave)T;
}
};
template<class T, TInt Id, class Creator = DefaultCreator<T> >
class CStaticData : public CCoeStatic
{
public:
static T* Instance()
{
CStaticData* instance = static_cast<CStaticData*> ( CCoeEnv::Static( TUid::Uid( Id ) ));
if ( !instance )
{
sbl::CPtr<CStaticData> data( new (ELeave)CStaticData);
data->t = Creator::Create();
instance = data.release();
}
return instance->t;
}
~CStaticData()
{
delete t;
}
private:
CStaticData(TScope scope = EThread) : CCoeStatic(TUid::Uid(Id), scope)
{
}
T * t;
};
使用:
TRect* rc = CStaticData<TRect, 1>::Instance();
rc->iTl.iX = 10;
rc->iTl.iY = 11;
或者, 如果你的class T有自己的NewL等函數, 那麼提供第3個模板參數Creator.
其中用到我前面說到的智能指針, 這個確實是個好東西, 用過以後我再也沒有遇到內存泄漏, 由於CleanupStack引起的Panic.(