Синглтон через умный указатель
От: pegarus Россия PegasResearch.ru
Дата: 06.03.09 23:30
Оценка:
Подскажите, как называется приведённая ниже реализация синглтона? Какие есть недостатки в отличие от синглтона Маерса?

/* Файл Single.h
Класс не допускает наследование.
Нежелательно динамическое размещение (assert'ы как раз из-за этого =).
Создаётся только один экземпляр CBase.
Не требует инстанциирования шаблона.
Не поддерживает многопточность.
CBase должен иметь конструктор без параметров.
*/
template <class CBase>
class CSingle
{
public:
  CSingle() : pcache(single.instance()) {}

  CBase* operator ->()
  {
    return pcache;
  }

  ~CSingle() { single.release(); }
private:
  CBase* pcache;

  template<CBase>
  class CSingleImpl // Введён для упрощения инстанциирования
  {
  public:
    CSingleImpl() : pn(0),px(0) {}

    CBase* instance()
    {
      if(!pn) px=new CBase();
      pn++;
    }

    void release()
    {
      assert(pn>=0); // Поможет отловить утечки
      pn--;
      if(!pn) delete px;
    }

    ~CSingleImpl() {assert(!pn);} // Поможет отловить утечки
  private:
    int pn;
    CBase* px;
  };

  typedef CSingleImpl<CBase> tSingle;
  static tSingle single;
};

template CSingle<CBase>::tSingle single;
синглтон паттерн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.