【发布时间】:2011-10-20 08:50:05
【问题描述】:
我目前正在使用以下简单的单例类:
template<class T>
class singleton
: boost::noncopyable
{
public:
static T& get_instance()
{
assert(sm_instance != nullptr);
return *static_cast<T*>(sm_instance);
}
protected:
singleton()
{
assert(sm_instance == nullptr);
sm_instance = this;
}
virtual ~singleton()
{
assert(sm_instance != nullptr);
sm_instance = nullptr;
}
private:
static singleton<T>* sm_instance;
};
template<class T> singleton<T>* singleton<T>::sm_instance = nullptr;
class example_one
: public singleton<example_one>
{
static example_one instance;
};
example_one example_one::instance;
class example_two
: singleton<example_two>
{
static example_two instance;
};
example_two example_two::instance;
// Usage:
example_one& x = example_one::get_instance();
example_two& y = example_two::get_instance(); // not accessible because 'example_two' uses 'private' to inherit from 'singleton<T>'
但是,我想调整一些东西。我不喜欢 get_instance() 被继承到派生类。
我想做这样的事情(非工作代码):
template<class T>
T& get_singleton();
template<class T>
class singleton
{
friend T& get_singleton()
{
assert(sm_instance != nullptr);
return *static_cast<T*>(sm_instance);
}
}
// Usage:
example_two& x = get_singleton<example_two>();
【问题讨论】:
-
如果你能以任何方式避免它,请不要使用单例 - stackoverflow.com/questions/1392315/…
-
您的代码没有多大意义。第一个示例检查它的实例字段是否为空,在 CONSTRUCTOR 中(为什么?),然后析构函数更糟糕。您的析构函数应该删除 sm_instance,或者根本不需要析构函数。同样将析构函数内的 instacne 字段设置为 null,完全没有意义。
-
@AngelO'Sphere - 我认为你应该再读一遍代码并考虑一下。
标签: c++ design-patterns singleton