单身实施问题

时间:2011-05-17 08:55:54

标签: c++ boost

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,这是一个单身人士吗?

1 个答案:

答案 0 :(得分:4)

 TestClass class1 = TestClass::instance();

您正在复制工厂返回的对象,因此每次都会获得不同的对象。

为了防止这种情况,请将引用添加到您的单身人士:

 TestClass& class1 = TestClass::instance();

仍有一些奇怪的事情,因为制作MyClass副本会发出编译错误(它通过boost::noncopyableSingleton继承,所以我不确定如何编译你发布的代码。