53 c++ singleton static global-variables
今天我的一个朋友问我为什么他更喜欢在全局静态对象上使用单例?我开始解释的方式是单例可以有状态与静态全局对象不会......但后来我不确定...因为这在C++中...(我来自C#)
一个优于另一个有什么优势?(在C++中)
vav*_*ava 57
实际上,在C++中,首选方式是本地静态对象.
Printer & thePrinter() {
static Printer printer;
return printer;
}
Run Code Online (Sandbox Code Playgroud)
这在技术上是单例,但这个函数甚至可以是类的静态方法.所以它保证在使用之前与全局静态对象不同,可以按任何顺序创建,这使得当一个全局对象使用另一个非常常见的场景时,可以无意义地失败.
通过调用创建新实例来做单例的常见方法是什么new
使得对象析构函数将在程序结束时被调用.动态分配的单例不会发生这种情况.
另一个积极的方面是,在创建单例之前无法访问单例,即使是从其他静态方法或子类中也是如此.为您节省一些调试时间.
rlb*_*ond 25
在C++中,不确定不同编译单元中静态对象的实例化顺序.因此,一个全局可能引用另一个未构造的全局,从而炸毁您的程序.单例模式通过将构造绑定到静态成员函数或自由函数来消除此问题.
有一个像样的总结在这里.
今天我的一个朋友问我为什么他更喜欢在全局静态对象上使用单例?我开始解释的方式是单例可以有状态与静态全局对象不会......但后来我不确定...因为这在C++中...(我来自C#)
静态全局对象也可以在C#中具有状态:
class myclass {
// can have state
// ...
public static myclass m = new myclass(); // globally accessible static instance, which can have state
}
Run Code Online (Sandbox Code Playgroud)
一个优于另一个有什么优势?(在C++中)
单例会破坏您的代码,而全局静态实例则不会.关于单身人士的问题已经有无数问题了.这是一个,另一个,或另一个.
简而言之,单身人士给你两件事:
如果我们只想要第一点,我们应该创建一个全局可访问的对象.而为什么会我们曾经希望第二个?我们事先不知道将来如何使用我们的代码,为什么要将其删除并删除可能有用的功能?当我们预测"我只需要一个实例"时,我们通常会犯错误."我只需要一个实例"(正确答案就是创建一个实例)和"如果创建了多个实例,应用程序在任何情况下都无法正常运行"之间存在很大差异.它会崩溃,格式化用户的硬盘并在互联网上发布敏感数据"(这里的答案是:最有可能你的应用程序坏了,但如果不是,那么是的,单身就是你需要的)