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:是的,没错。它是公共的,在传统的单身模式中,你希望它是私有的。然而,您的类听起来更像是静态变量的集合,而不是单个变量,在这种情况下,它根本不应该是一个类。