单态类,即SingleTon 设计模式。是c++设计模式中是最简单,又最有用的设计模式。在标准的c++程序设计中使用单态类很简单。无非就是利用一个静态的成员变量和静态的成员函数来实现。使用单态类最重要的目的就是使类只能有一个实例,以达到数据共享的目的。但是在symbian中,不易使用静态成员变量,又不能使用全局变量类共享数据。尤其中s60 2.0版本以上更是不支持静态成员变量的存在。那么,要求共享一份数据时,要怎么实现呢?
在SymbianOS中,在每个线程上加载的DLL都有一个线程指定的机器字,可以被用来写或读,除此之外没有其他静态内存存在了。因而,我们可以利用Tls类实现数据共享的目的。我们可以把需要实现数据共享的变量归类放在一个单独的类中,由该类来使用Tls,达到数据的共享。以下是简单的Tls演示的源代码:
- // CMyData.h
- class CMyData
- {
- public:
- static CMyData* NewL();
- void Free();
- private:
- CMyData(); //构造函数私有。该类便不能拷贝。
- ~CMyData();
- }
- //CMyData.cpp
- #include "MyData.h"
- CMyData::CMyData()
- {
- }
- CMyData::~CMyData()
- {
- }
- CMyData* RMyData::NewL()
- {
- CMyData *instance;
- if(Dll::Tls() == NULL)
- {
- instance = new (ELeave) CMyData();
- CleanupStack::PushL(instance);
- TInt err = Dll::SetTls(static_cast<TAny*>( instance ));
- CleanupStack::Pop(instance);
- if ( err == KErrNone )
- {
- return instance;
- }
- else
- {
- delete instance;
- User::Leave( err );
- return NULL;
- }
- }
- else
- {
- instance = static_cast<CMyData*>( Dll::Tls() );
- return instance;
- }
- }
- void CMyData::Free()
- {
- CMyData *instance;
- if(Dll::Tls())
- {
- instance = static_cast<CMyData*>( Dll::Tls() );
- Dll::FreeTls();
- delete instance;
- }
- }
其他类可以通过CMyData::NewL()来实现该类中数据的存取。