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

Juk*_*bom 0 c++ design-patterns

无论马歇尔Clines''C++ FAQ精简版’和斯科特迈尔斯有效的C++建议使用返回局部静态对象的功能,以避免与非局部静态对象的初始化顺序可能出现的问题.

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

FileSystem& tfs()
{
  static FileSystem fs;
  return fs;
}
Run Code Online (Sandbox Code Playgroud)

两位编写者都补充说,这与Singleton模式类似,不同之处在于它不能确保本地fs是FileSystem的唯一实例.

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

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

小智 5

您可以同时使用:

class Singleton {

   public:

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

   private:

       Singleton() {}
};
Run Code Online (Sandbox Code Playgroud)

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

请注意,此构造(与涉及静态变量的所有构造一样)不是线程安全的.如果线程安全性存在问题,则在访问静态Singleton变量时需要考虑使用双重检查锁定模式.