C ++: шаблоны и шаблон синглтона - PullRequest
7 голосов
/ 21 апреля 2011

Так получилось, что мне нужен печально известный шаблон синглтона.А еще лучше, так что мне нужны печально известные шаблоны C ++ в сочетании с этим шаблоном.Итак, что меня беспокоит, так это:

template <class T>
class PDatabaseTable
{
    ...

    static PDatabaseTable <T> & instance()
    {
        static PDatabaseTable <T> singleton;
        return singleton;
    }

    ...
};

Это типичный способ реализации синглтона, который должен быть создан при первом использовании.Теперь у нас есть статическая переменная singleton .Поскольку функция instance () может вызываться из нескольких разных модулей, вопрос заключается в следующем: будет ли только один экземпляр объекта для любого данного типа T или будет создан каждый модульсвой собственный синглтон?

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Для каждого типа T будет только один экземпляр, точно так же, как если бы это был не шаблон, был бы только один экземпляр.

Функция является встроенной, что означает, что хотя она может быть определена в нескольких единицах компиляции, после связывания будет только одна ее версия и только один экземпляр любых локальных статических объектов.

2 голосов
/ 21 апреля 2011

Ваш синглтон называется Meyers Singleton, и вы можете найти объяснение безопасности потоков этого типа синглтона в статье Статические локальные переменные и безопасность потоков в g ++ , в которой хорошо объясняется, как статические локальные переменные можно создавать потокобезопасно.

1 голос
/ 09 января 2013

Вы МОЖЕТЕ переместить инициацию статического за пределы тела класса, и это также возможно для статической функции.

template <typename T>
class Singleton
{
public:
  static Singleton<T>* Singleton::getInstance();
  T* getMember() { member_; }
protected:
  Singleton() { member_ = new T; }
  ~Singleton() { if (singleton_) delete member_; }
private:
  static Singleton<T>* singleton_;
  T* member_;
};
template <typename T>
Singleton<T>* Singleton<T>::getInstance()
{
  if (NULL == singleton_) singleton_ = new Singleton;
  return singleton_;
}
template <typename T>
Singleton<T>* Singleton<T>::singleton_ = NULL;
1 голос
/ 21 апреля 2011

Определенно будет только один экземпляр .

Мне просто интересно, почему вы не можете переместить этот статический объект из функции в тело класса?

template <class T>
class PDatabaseTable
{
  static PDatabaseTable <T> singleton;
  static PDatabaseTable <T> & instance()
  {
    return singleton;
  }
};
template<class T>
PDatabaseTable<T> PDatabaseTable<T>::singleton;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...