C ++:模板和单例模式

时间:2011-04-21 04:50:32

标签: c++ templates singleton

这恰好使我需要臭名昭着的单身人士模式。更好的是,它发生在我需要臭名昭着的C ++模板与该模式相结合。所以,困扰我的是:

template <class T>
class PDatabaseTable
{
    ...

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

    ...
};

这是实现应该在第一次使用时创建的单例的典型方法。现在,我们有一个静态变量 singleton 。由于可以从几个不同的模块调用 instance()函数,因此问题是:对于任何给定类型 T ,是否只有一个对象实例,或者每个模块实例化它自己的单例?

4 个答案:

答案 0 :(得分:5)

每种类型T只会有一个实例,就像它不是模板一样,只有一个实例。

该函数是内联的,这意味着尽管它可以在多个编译单元中定义,但在链接之后,它只有一个版本,并且只有一个本地静态对象的实例。

答案 1 :(得分:2)

您的单身人士称为Meyers Singleton,您可以在Static locals and threadsafety in g++文章中找到有关此单例类型的线程安全性的说明,该文章很好地解释了静态局部变量如何创建线程安全。

答案 2 :(得分:1)

肯定会有只有一个实例

我只是想知道为什么你不能将那个静态对象从函数中移出到类体中?

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

答案 3 :(得分:1)

您可以将静态的init移动到类体外部,这也可以用于静态函数。

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;