单例类的确切用法和实现是什么?
what is the exact use and implementation of singleton class?
我知道单例类不允许创建多个对象。但是根据我下面的代码,我可以创建尽可能多的对象。
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;
}
在这里,我能够在静态函数中创建对象(因为我可以访问类中的构造函数),那么单对象的概念在哪里?
这不是单例,原因很简单,你故意写了一些不是单例的东西。
这个想法是,您编写instance
函数,以便它只创建一个实例,并编写其他成员,以便它们不创建任何实例。然后,因为它们是唯一可以创建任何实例的函数,所以只有一个。
如果你删除狡猾的Singleton sing;
,那么你将有一个单例实现-只有一个实例将被创建,第一次有人调用该函数。
单对象的概念出现在你的代码中,每次你需要一个object的实例,而不是使用:
Singleton *myOwnSingleton= new Singleton(20);
你应该总是使用:
Singleton *pt = Singleton::createInstance();
由于构造函数在类的外部是不可访问的,创建Singleton的唯一方法是通过Singleton::createInstance()
,如果你阅读代码,只有我们第一次调用Singleton::createInstance()
时才创建一个新的实例。
对该方法的所有后续调用都将返回已经创建的对象。因此,在所有的执行中,您将只创建一个实例。
但是当然……你应该删除
行Singleton sing;
,因为它是对Singleton的错误使用。如果你创建一个叫做CAR的类,但是没有轮子…它不是一辆汽车。你创建了一个叫做singleton的类,但是。使用两个相同类型的对象。这不是美!
相关文章:
- 实现无开销push_back的最佳方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 在 C++17 中实现迭代器和const_iterator的正确方法是什么?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 实现此自定义priority_queue的正确方法是什么
- 实现此"on error, throw"回调的最佳方法是什么?
- 在QGraphicsView上实现交互式样条曲线的最佳方法是什么?
- 当您知道结构将来会更改时,实现结构读写的最佳方法是什么
- std :: is_nothrow_copy_copy_constructible的实现是什么?
- 具有多态数据的容器的常见实现是什么
- RWTPtrOrderedVector的替代实现是什么
- 将一元函数应用于向量的某些元素的良好实现是什么?
- 向量类中擦除函数的正确实现是什么
- 映射到ASCII的Character的底层实现是什么?
- c++中标准的延迟/终结器实现是什么?
- 访问和更改长布尔数组的最快实现是什么?
- 单例类的确切用法和实现是什么?