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

时间:2012-07-06 12:21:19

标签: c++

  

可能重复:
  What is so bad about singletons?
  Singleton pattern in C++

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

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

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

2 个答案:

答案 0 :(得分:3)

我更喜欢:

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

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

答案 1 :(得分:2)

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

在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;
};