在C++中创建单子类Singletons的正确方法吗?


Is this correct way of creating a singleton class in C++?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is so bad about singletons?
Singleton pattern in C++

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

1
2
3
4
5
class a
{
    static int a;
    static GetA();
}

现在,所有想要使用我的singleton类的类都不能为我的类创建任何对象,也将获得相同的值。我只想知道这个实现是否能够解决所有的目的,满足创建单例类的所有标准。


我更喜欢:

1
2
3
4
5
GlobalObjectMgr& GlobalObjectMgr::instance()
{
    static GlobalObjectMgr objMgr;
    return objMgr;
}

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


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

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

如果需要静态变量和函数的集合,请将它们放在命名空间而不是类中:

1
2
3
4
namespace stuff {
    int a;
    void do_something();
}

如果你认为你想要一个单例,那么再考虑一下;你通常最好避免使用全局可访问的对象。如果您仍然需要一个,那么您将使用一个私有构造函数和一个公共访问器来创建一个类,该访问器将返回对单个实例的引用,其行如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class singleton {
public:
    singleton & get() {
        static singleton instance;
        return instance;
    }

    int a;
    void do_something();

private:
    singleton() {}
    ~singleton() {}
    singleton(singleton const &) = delete;
};