这恰好使我需要臭名昭着的单身人士模式。更好的是,它发生在我需要臭名昭着的C ++模板与该模式相结合。所以,困扰我的是:
template <class T>
class PDatabaseTable
{
...
static PDatabaseTable <T> & instance()
{
static PDatabaseTable <T> singleton;
return singleton;
}
...
};
这是实现应该在第一次使用时创建的单例的典型方法。现在,我们有一个静态变量 singleton 。由于可以从几个不同的模块调用 instance()函数,因此问题是:对于任何给定类型 T ,是否只有一个对象实例,或者每个模块实例化它自己的单例?
答案 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;