template <class T>
class Singleton
{
public:
static T& instance()
{
boost::call_once(init, flag);
return *t;
}
static void init()
{
t.reset(new T());
}
protected:
~Singleton() {}
Singleton() {}
private:
static boost::scoped_ptr <T> t;
static boost::once_flag flag;
};
template <class T> boost::scoped_ptr<T> Singleton<T>::t(0);
template <class T> boost::once_flag Singleton<T>::flag = BOOST_ONCE_INIT;
class TestClass : public Singleton<TestClass>
{
friend class Singleton<TestClass>;
private:
TestClass(){}
};
对于上述实施,我有一个问题如下:
TestClass class1 = TestClass::instance();
TestClass class2 = TestClass::instance();
我找到了&class1 != &class2
,这是一个单身人士吗?
答案 0 :(得分:4)
TestClass class1 = TestClass::instance();
您正在复制工厂返回的对象,因此每次都会获得不同的对象。
为了防止这种情况,请将引用添加到您的单身人士:
TestClass& class1 = TestClass::instance();
仍有一些奇怪的事情,因为制作MyClass副本会发出编译错误(它通过boost::noncopyable
从Singleton
继承,所以我不确定如何编译你发布的代码。