Re: Singleton руками
От: Caracrist https://1pwd.org/
Дата: 26.05.09 12:21
Оценка: 7 (1)
Здравствуйте, 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();
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.