单身的静态变量位置

时间:2011-04-05 23:00:12

标签: c++ design-patterns singleton

我对singlton有疑问。

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

为什么不这样工作

class singleton{

  private:

  static singleton & m_singleton;

  public:

  static singleton& get_instance{

          return m_singleton;
  }

}

但我必须像这样

class singleton{

  public:

  static singleton& get_instance{

     static singleton & m_singleton;

          return m_singleton;
  }

}

有什么区别?

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

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

非常感谢!

1 个答案:

答案 0 :(得分:5)

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

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

另请注意,第二个错误。没有初始化,您无法定义参考。此

static SomeClass &var;

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

如果在第二个示例中将静态变量定义为指针,则可以通过仔细初始化指针来避免我提到的线程问题。在this class article中了解更多相关信息(关于Java,但核心问题是相同的)