Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是在C+;中创建单例类的正确方法吗+;?_C++ - Fatal编程技术网

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

C++ 这是在C+;中创建单例类的正确方法吗+;?,c++,C++,可能重复: 我想创建一个单例类。为此,我创建了一个类,它的所有成员和方法都是静态的。像这样的 class a { static int a; static GetA(); } 现在,所有想要使用我的singleton类的类都不能为我的类创建任何对象,也将获得相同的值。我只想知道这个实现是否能解决创建singleton类的所有目的和条件。我更喜欢: GlobalObjectMgr& GlobalObjectMgr::instance() { static Gl

可能重复:

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

class a
{
    static int a;
    static GetA();
}
现在,所有想要使用我的singleton类的类都不能为我的类创建任何对象,也将获得相同的值。我只想知道这个实现是否能解决创建singleton类的所有目的和条件。

我更喜欢:

GlobalObjectMgr& GlobalObjectMgr::instance()
{
    static GlobalObjectMgr objMgr;
    return objMgr;
}
不需要类成员变量,它只在需要时创建。

我更喜欢:

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

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

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

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

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

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

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

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

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

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

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