crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

ViGOur
  опции профиля:
сообщение 26.2.2013, 14:24
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Подумалось мне тут, что если взять типизированный синглтон:
template <class T>
class CTypedSingleton;
который создает-возвращает указатель на класс типа T, то при вызове:
delete p; // указатель на класс типа T
вызываться декремент счетчика ссылок у нас не будет и его нужно вызывать в ручную, что чревато ошибками!
Следовательно нужно создать некий класс обертку, который открыто унаследован от класса T и закрыто от нашего типизированного синглтона, а в нем уже переопределить operator delete, в котором собственно и вызывать наш CTypedSingleton<T>::free();

Что я и сделал в коде ниже:
собственно сам код
#include <iostream>

class CClass
{
public:
    virtual ~CClass(){  }
};

template <class T>
class CTypedSingleton;

template<class T>
class CTypedWrapper : public T, private CTypedSingleton<T>
{
public:
    void operator delete(void *p)
    {
        std::cout << "CTypedWrapper::operator delete" << std::endl;
        CTypedSingleton<T>::free();
    }
};

template <class T>
class CTypedSingleton
{
    static T* m_self;
    static int m_refcount;

protected:
    CTypedSingleton(){}
    CTypedSingleton(const CTypedSingleton&){}
    virtual ~CTypedSingleton(){ m_self = 0; }
    CTypedSingleton &operator=(const CTypedSingleton&){}

public:
  static T *init()
  {
      std::cout << "init" << std::endl;
      if(!m_self)
          m_self = new CTypedWrapper<T>;
      m_refcount++;
      return m_self;
  }

  static void free()
  {
      std::cout << "free" << std::endl;
      if( m_refcount > 0)
      {
          --m_refcount;
          if( m_refcount == 0)
          {
              delete m_self;
              m_self = 0;
          }
      }
  }
};

template <class T>
T *CTypedSingleton<T>::m_self = 0;

template <class T>
int CTypedSingleton<T>::m_refcount = 0;

int main(int , char **)
{
    CClass *p = CTypedSingleton<CClass>::init();
    delete p;

    return 0;
}
В принципе потенциальных проблем я не виже, но может это из-за того, что я пока грипую и возможно не так внимателен...
Что вы скажите?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.6.2025, 14:11