【问题标题】:Is this correct way of creating a singleton class in C++? [duplicate]这是在 C++ 中创建单例类的正确方法吗? [复制]
【发布时间】:2012-07-06 21:45:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这不是一个实现。它什么也没说。
  • 正如所写,任何人都可以创建它(因为构造函数是公共的),但没有人可以访问静态实例(因为它和访问器都是私有的)。这与您想要的相反。
  • @Apoorvasahay:不;但是如果一切都是静态的,那么无论如何都不需要构造函数(除非将其设为私有,如果您希望它更单例)。此外,它根本不需要成为一个类。
  • 但是编译器自己提供了一个默认的 CTOR,如果不提供的话。如果我错了,请纠正。
  • @Apoorvasahay:是的,没错。它是公开的,在传统的单例模式中,您希望它是私有的。但是,您的类听起来更像是静态变量的集合而不是单例,在这种情况下,它根本不应该是一个类。

标签: c++


【解决方案1】:

我更喜欢:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多