Здравствуйте, agg, Вы писали:
agg>Здравствуйте, встала задача написать Singleton для iPhone, посмотрел иходник из Loki и вот что получилось:
agg>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
Во первых нет смысла заморачиваться с CreationPolicy, всегда для синглтона можно сделать дефолтный конструктор.
Во вторых ваша система полетит при мульти трединге.
Предлагаю вариант на случай если мульти трединг и скорость доступа актуальны.
(код под винду)
template <typename T>
class SingletoneS
{
static T * CreateSingletone()
{
if (::InterlockedIncrement(&m_Lock) == 1)
{
_instance = new T();
}
else
WaitForSingleObject(m_lSignal,INFINITE);
Instance = ReturnInstance;
SetEvent(m_lSignal);
return Instance();
}
static T * ReturnInstance()
{
return _instance;
}
static T * _instance;
static volatile LONG m_Lock;
static HANDLE m_lSignal;
public:
static void Reset()
{
T * temp = _instance;
_instance = NULL;
ResetEvent(m_lSignal);
Instance = CreateSingletone;
delete temp;
}
static T * (__cdecl * Instance)(void) ;
};
template <typename T> T * SingletoneS<T>::_instance = NULL;
template <typename T> volatile LONG SingletoneS<T>::m_Lock = 0;
template <typename T> T * (__cdecl * SingletoneS<T>::Instance)(void) = SingletoneS<T>::CreateSingletone;
template <typename T> HANDLE SingletoneS<T>::m_lSignal = CreateEvent(NULL,NULL,false,NULL);
template <typename T> T * Singletone()
{
return SingletoneS<T>::Instance();
}
#define DefineSingletone(Class) \
private:\
friend class SingletoneS<Class>; \
Class();