下面这个是基于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.