singleton和经典构造函数
singleton and classic constructor
这个问题相当基础。我对我的cygwin进行了一个简单而直接的测试:
class Example {
public:
Example(){ cout<<"dude..."<<endl; }
~Example(){ cout<<"see ya"<<endl; }
public:
static Example *GetInstance(){
if(m_instance==NULL){
m_instance = new Example();
cout<<"watch out bro"<<endl;
}
return m_instance;
}
public:
void exp(){cout<<"greetings"<<endl;}
private:
static Example *m_instance;
};
int main(){
Example a;
return 0;
}
显然,输出是:
dude...
greetings
see ya
在c++编程中,从技术上讲,singleton和典型的构造函数是截然不同的,因为singleton将构造函数设置为私有的,而典型的方法则相反。在我最近的实习经历中,我注意到大多数程序员都是以这种方式实现API的。
我只是想知道,当两种类构造方法并行存在时,情况是这样还是没有必要。
更新
是构造函数&存在于一个程序中的singleton实际上是无稽之谈,因为这个范围内的singleton内容会变成无用的代码,就像不安全的垃圾一样?
摘要这是一个胡说八道的问题。。。更重要的是,感谢你们所有的天才构造函数和单例设计模式是"互斥的",就可修复性而言,这与全局变量杀死我们的调试时间是一样的。。。
通过公开Example的构造函数,您可以允许类的用户直接创建实例。如果您的设计只需要您的singleton的一个实例,那么这就允许用户无意中破坏这一要求。如果您将构造函数设为私有,那么调用GetInstance()将是创建Example对象的唯一方法,从而强制要求只允许创建一个实例。
请注意,静态对象的销毁顺序与创建它们的顺序相反。如果对象相互引用,则会导致问题。对于维护代码的人来说,这是一个陷阱,如果你有多个这样的对象,这很快就会变得难以管理。
许多开发人员认为单身是一件坏事,就像全局变量一样:
https://sites.google.com/site/steveyegge2/singleton-considered-stupid
当使用Singleton设计模式时,您应该始终将构造函数(也复制构造函数)和operator=设为私有,以确保给定类只有一个实例。否则,辛格尔顿模式就没有多大意义了。
我认为您错过了singleton的整个概念。Singleton意味着只有一个实例,但公共构造函数可以构造许多对象。
我认为这个例子已经被破坏了。它允许用户创建多个"singleton",然后很明显它们并没有singleton。
在singleton中,构造函数必须是私有的。
仅仅使构造函数私有并不能使类Singleton。为此,在调用构造函数之前,必须确保内存中没有其他实例。即使构造函数是私有的,也可以从静态类成员
然而,它仍然有一个静态的GetInstance()方法,它在某种程度上被认为是一个单例接口,这让没有编写代码的人(甚至一段时间后的作者)感到困惑。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- singleton和经典构造函数