将Singleton或函数范围本地静态对象优先于彼此的原因是什么?

时间:2009-04-10 13:13:19

标签: c++ design-patterns

Marshall Clines' "C++ FAQ Lite"和Scott Meyers的Effective C ++建议使用返回本地静态对象的函数来避免非本地静态对象初始化顺序可能出现的问题。

简而言之(来自“Effective C ++”,Scott Meyers的第3版):

FileSystem& tfs()
{
  static FileSystem fs;
  return fs;
}

两位作者都补充说,这与Singleton模式类似,只是这不能确保本地fs是FileSystem的唯一实例。

现在,在资源管理类T的一个实例足够的情况下,您更喜欢Singleton类或本地静态方法的原因是什么?尽管我们的应用程序不需要多于一个实例,但并不一定要将T类限制为仅使用一个实例。

显然,在进行TDD时有一个全局对象是一个问题,但在这种情况下,这两种方法都是全局的。

2 个答案:

答案 0 :(得分:5)

您可以同时使用:

class Singleton {

   public:

      static Singleton & Instance() {
          static Singleton s;
          return s;
      }

   private:

       Singleton() {}
};

现在可以通过Instance函数创建Singleton的唯一方法(因为构造函数是私有的),因此您可以保证只存在一个Singleton。如果你想使用你的问题中描述的自由函数方法,你可以考虑使该函数成为Singleton类的朋友,同时保留私有构造函数。

请注意,此构造(与涉及静态变量的所有构造一样)不是线程安全的。如果线程安全是一个问题,则在访问静态Singleton变量时需要考虑使用double-checked locking模式之类的东西。

答案 1 :(得分:0)

当你不能有多个对象说CEO类时使用单身人士 - 显然两个或更多CEO会破坏你的公司;)对于单身人士,你无法创建根据定义,任何一个以上的对象

  • private ctor
  • 静态访问者。

然而,功能范围本地对象是完全不同的野兽。这个成语并不排除在周围有其他此类对象的可能性。这通常可以在Logger类的情况下找到,您可以在其中创建自己的Logger对象,并且库编写器还为您提供了一个DefaultLogger()函数,用于快速和丑陋的日志记录,它只包含一个static Logger对象。

请注意,Singleton对象访问器的某些实现可以使用函数范围变量idiom。