Singleton pattern in C++
我是一个新的,有点无知的C++,我遇到了一个C++代码,使用一个单独的模式,
1 2 3 4 5 6 7 8 9 10 11 12 13
| class CFoo
{
public:
static CFoo& getInstance()
{
static CFoo self;
return self;
}
private:
CFoo(){}
~CFoo(){}
}; |
我只是很困惑为什么要返回静态引用?这是有效的代码吗?为什么程序员不使用指针?
为什么要使用指针?引用很简单,并且与我想做的匹配:为对象加别名,而不是指向它。static不适用于引用,它适用于函数,使其可以在没有实例的情况下调用。
(更好的是,为什么要用单件的?)
- +如果可以的话,我也会投票给@jalf。
- 好啊。单件使用过度,很少正确使用。但这并不能阻止它发挥作用。问题是我们教人们使用它的方式。演示singleton是什么的最简单方法(如上所述)只显示了singleton,但不显示如何正确使用它。单例模式的问题不是单例模式,而是它在提供globally accessible mutable state时的用途。关于这个话题的一个好话题是:youtube.com/watch?V= FRM3VPHSEI
- @马丁:你能概括一下单人间的好用法吗?
- @GMAN:不,这要看情况而定。但它是其中一种不能单独使用的模式。您需要一种方法来决定创建什么,比如一个可能返回singelton或其他对象(比如测试对象)的工厂。
- @马丁:不,全球可变状态是单子问题的一半。我同意你的观点,如果这是唯一的问题的话,那么独生子会有它们的用途(偶尔)。问题是,它们还为您提供了一个完全荒谬的编译时保证,其唯一效果是使您更难使代码适应不断变化的需求。我从来没有见过这样一个例子,一个单体的两个性质都是可取的。(全局可变状态偶尔正常。通常不需要单实例限制。我无法想象你想要两个都要的情况。)
- 还有其他的模式给我们提供了全局可变状态,实现的复杂性更低,潜在的细微错误也更少(例如,同步,或者单例之间的依赖关系,在启动或关闭时会变得异常复杂)。如果这就是我们所追求的,那么使用单态模式来代替单态模式仍然没有意义。
一个静态局部变量,如self一旦初始化(第一次通过函数getinstance),在程序的整个过程中保持不变,除非明确删除。因此,将引用返回到self是完全安全的。
注意,它是getInstance,在函数声明中是静态的。函数的返回类型不允许使用存储类说明符。
我建议你使用单态设计模式,当然除非强烈建议需要单态
如果使用指针,则必须取消对指针的引用,以便使用由cfoo实现的任何重载运算符。如果它返回一个指针,代码可能如下所示:
1
| (*(CFoo::getInstance ())) =="comparison overloaded op" |
VS
1
| CFoo::getInstance () =="comparison overloaded op" |
- 虽然是真的,但在单例对象上比较相等是否真的有意义?
- 如果等式是一个重载的运算符,情况就会是这样。也许您正在单例中全局管理某个状态,您想查询该程序是否处于给定状态?有很多理由可以用某种东西来检验单子的相等性。它可以很容易地成为重载的一元运算符"cfoo::getInstance()++"。该字符串只是一个示例,显示它正在调用重载运算符。