这是在C++中创建单例类的正确方法吗?

  • 本文关键字:方法 单例类 C++ 创建 c++
  • 更新时间 :
  • 英文 :


可能的重复项:
单身人士有什么不好?
C++中的单例模式

我想创建一个单一实例类。为此,我创建了一个类,其所有成员和方法都是静态的。像这样的东西。

class a
{
    static int a;
    static GetA();
}

现在,所有想要使用我的单例类的类都无法为我的类创建任何对象,并且也将获得相同的值。我只想知道此实现是否会解决创建单例类的所有目的并满足所有条件。

我更喜欢:

GlobalObjectMgr& GlobalObjectMgr::instance()
{
    static GlobalObjectMgr objMgr;
    return objMgr;
}

不需要类成员变量,仅在需要时创建该变量。

传统的单例(反)模式不是静态变量的集合;相反,它是一个具有非静态成员的对象,其中只能存在一个实例。

在C++中,这使您可以避免静态变量的最大问题:"初始化顺序惨败"。由于不同翻译单元中的静态变量未指定初始化顺序,因此存在一个构造函数可能会在初始化之前尝试访问另一个构造函数的危险,从而产生未定义的行为。但是,它引入了其他问题(类似的"破坏顺序惨败",以及旧编译器中的线程安全问题),因此仍然需要避免。

如果你想要一个静态变量和函数的集合,那么把它们放在一个命名空间而不是一个类中:

namespace stuff {
    int a;
    void do_something();
}

如果你认为你想要一个单例,那么再想一想;你通常最好完全避免全局可访问的对象。如果你仍然想要一个,那么你可以创建一个带有私有构造函数的类,以及一个返回对单个实例的引用的公共访问器,如下所示:

class singleton {
public:
    singleton & get() {
        static singleton instance;
        return instance;
    }
    int a;
    void do_something();
private:
    singleton() {}
    ~singleton() {}
    singleton(singleton const &) = delete;
};

最新更新