快速提问。无论如何都要继承单例,以便子类是单例吗?我已经四处寻找,但我能找到的每一个单身都是按类实现的,而不是通用的。
答案 0 :(得分:9)
是的,有一种通用方式。您可以通过CRTP实现Singleton,例如:
template<typename T>
class Singleton
{
protected:
Singleton() noexcept = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
virtual ~Singleton() = default; // to silence base class Singleton<T> has a
// non-virtual destructor [-Weffc++]
public:
static T& get_instance() noexcept(std::is_nothrow_constructible<T>::value)
{
// Guaranteed to be destroyed.
// Instantiated on first use.
// Thread safe in C++11
static T instance;
return instance;
}
};
然后从中派生出来让你的孩子成为单身人士:
class MySingleton: public Singleton<MySingleton>
{
// needs to be friend in order to
// access the private constructor/destructor
friend class Singleton<MySingleton>;
public:
// Declare all public members here
private:
MySingleton()
{
// Implement the constructor here
}
~MySingleton()
{
// Implement the destructor here
}
};
答案 1 :(得分:1)
单例有一个静态getInstance()
方法,在第一次调用时会创建该类的单个实例,因此静态绑定到要实例化的单例类的类型。我没有看到拥有Singleton层次结构的直接效用。但是如果你坚持使用getInstance
方法virtual
并在扩展你的父单例的类中重写它。
class Singleton {
public virtual Singleton * getInstance() const
{
// instantiate Singleton if necessary
// return pointer to instance
}
...
};
class MySingleton : public Singleton {
// overrides Singelton's getInstance
public virtual MySingleton * getInstance() const
{
// instantiate MySingleton if necessary
// return pointer to instance
}
};
当然,强大的实现会存储并返回智能指针。