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,这是单例吗?

最佳答案

 TestClass class1 = TestClass::instance();

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

为防止这种情况,请获取您的单例的引用:
 TestClass& class1 = TestClass::instance();

仍然有些奇怪,因为复制MyClass会导致编译器错误(它通过boost::noncopyable继承自Singleton,所以我不确定如何编译发布的代码。

关于c++ - 单例实现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6028472/

10-11 00:36