单身的静态变量位置

sky*_*oor 2 c++ singleton design-patterns

我对singlton有疑问.

我应该在哪里声明单例类的静态成员?

为什么不这样工作呢

class singleton{

  private:

  static singleton & m_singleton;

  public:

  static singleton& get_instance{

          return m_singleton;
  }

}
Run Code Online (Sandbox Code Playgroud)

但我必须是这样的

class singleton{

  public:

  static singleton& get_instance{

     static singleton & m_singleton;

          return m_singleton;
  }

}
Run Code Online (Sandbox Code Playgroud)

差异是什么?

我知道有另一种方法可以使用指针,但现在我只讨论使用对象的情况.

另外一个问题是,使用指针和单身人士参考的利弊是什么?

非常感谢!

sho*_*osh 5

在第一种情况下,在程序初始化之前,在main()调用之前构造单例(构造函数被调用).在这种情况下,您还需要在cpp文件中的某处定义静态变量.

在第二种情况下,在首次调用函数时构造单例.请注意,此实现不是线程安全的,因为函数中的静态变量初始化不是线程安全的.如果两个线程在第一次看到这个函数时,你很可能会得到两个单例.

另请注意,第二个中有一个错误.没有初始化,您无法定义参考.这个

static SomeClass &var;
Run Code Online (Sandbox Code Playgroud)

不编译.您需要删除引用以创建类的实际实例,而不是引用,然后返回对它的引用.

如果在第二个示例中将静态变量定义为指针,则可以通过仔细初始化指针来避免我提到的线程问题.在这篇类文章中阅读更多相关内容(讨论Java,但核心问题是相同的)