我知道单例类不允许创建多个对象。但根据我的下面的代码,我可以创建尽可能多的对象。
class Singleton
{
private :
static Singleton *m_Instance;
Singleton()
{
cout<<"In defailt constructor"<<endl;
}
Singleton(int x)
{
i = x;
cout<<"in param const"<<endl;
}
public:
static int i;
static Singleton* createInstance()
{
if(!m_Instance)
m_Instance = new Singleton(20);
Singleton sing;
return m_Instance;
}
};
int Singleton::i=0;
Singleton* Singleton::m_Instance = NULL;
int main()
{
Singleton *pt = Singleton::createInstance();
return 1;
}
这里我能够在静态函数中创建一个对象(因为我可以访问类中的构造函数)然后单个对象的概念在哪里?
答案 0 :(得分:3)
这不是一个单身人士,原因很简单,你故意写了一些不是单身人士的东西。
这个想法是你编写instance
函数,这样它只会创建一个实例,并编写其他成员,这样他们就不会创建任何实例。然后,由于它们是唯一可以创建任何实例的函数,因此只有一个。
如果删除狡猾的Singleton sing;
,那么您将拥有单例实现 - 只有一个实例将被创建,这是第一次有人调用该函数。
与在C ++中实现此反模式的所有尝试一样,存在一些问题:对象永远不会被破坏,并且初始化不是线程安全的。存在各种其他方法,每种方法都有其自身的缺点。我建议你完全避免全局变量,无论你是否将它们打扮成单身人士或其他反模式。
答案 1 :(得分:1)
单个对象的概念出现在代码中,每当您需要Object的实例时,而不是使用:
Singleton *myOwnSingleton= new Singleton(20);
您应该始终使用:
Singleton *pt = Singleton::createInstance();
由于构造函数在类之外是不可访问的,因此创建Singleton的唯一方法是Singleton::createInstance()
,如果您阅读代码,那么我们第一次调用Singleton::createInstance()
一个新实例创建。
对此方法的所有后续调用都将返回已创建的对象。因此,在您执行的所有操作中,您只能创建一个实例。
但当然......你应该删除这行
Singleton sing;
因为它是Singleton的错误利用。如果你创建一个名为CAR但没有轮子的类......它不是汽车。你创建了一个名为singleton的类,但是......有两个相同类型的对象。这不是美女!