【问题标题】:Singleton pattern in C++C++ 中的单例模式
【发布时间】:2010-11-03 03:56:22
【问题描述】:

我是新手,对 C++ 有点无知,我遇到了一个使用单例模式的 C++ 代码,

class CFoo
{
 public:
   static CFoo& getInstance()
   {
     static CFoo self;
     return self;
   }

 private:
   CFoo(){}
   ~CFoo(){}
};

我很困惑为什么要返回静态引用?这是一个有效的代码吗?为什么程序员不用指针?

【问题讨论】:

    标签: c++ pointers static singleton


    【解决方案1】:

    为什么要使用指针?引用很简单,并且与我想要做的匹配:给对象取别名,而不是指向它。 static 不适用于引用,它适用于函数,使其无需实例即可调用。

    (更好,why use a singleton?)

    【讨论】:

    • 好的。单例被过度使用,很少被正确使用。但这并不妨碍它发挥作用。问题在于我们教人们使用它的方式。演示什么是单例(如上)的最简单方法只是显示单例,而不是如何正确使用它。单例的问题不是单例模式,而是它在提供globally accessible mutable state 时的用途。一个很好的话题是:youtube.com/watch?v=-FRm3VPhseI
    • @GMan:不,这取决于情况。但它是不能孤立使用的模式之一。您需要一种方法来决定创建什么,例如一个可能返回单例或其他对象(如测试对象)的潜在工厂。
    • @Martin:不,全局可变状态是单例问题的一半。我同意你的看法,如果这是唯一的问题,那么单身人士(偶尔)会有它们的用途。问题是它们给你一个完全荒谬的编译时保证,其唯一的效果是让你更难适应你的代码以适应不断变化的需求。我从未见过both 需要单例属性的情况。 (全局可变状态偶尔也可以。通常不需要单实例限制。我无法想象你想要both的情况。)
    • 还有其他模式可以为我们提供全局可变状态,实现更简单,也更不容易出现微妙的错误(例如同步,或单例之间的依赖关系,在启动或关闭时会变得非常复杂)。如果这就是我们所追求的,那么使用单例而不是单态模式仍然没有意义
    【解决方案2】:

    静态局部变量,例如self 一旦初始化(第一次通过函数 getInstance)将在程序的整个持续时间内保留,除非明确删除。因此,返回对self 的引用是完全安全的。

    注意getInstance 在函数声明中是静态的。函数的返回类型上不允许使用存储类说明符。

    我建议您使用Monostate design pattern,除非强烈建议您使用 Singleton

    【讨论】:

      【解决方案3】:

      如果使用指针,则必须取消引用指针才能使用 CFoo 实现的任何重载运算符。如果它返回一个指针,代码可能如下所示:

      (*(CFoo::getInstance ())) == "comparison overloaded op"
      

      对比

      CFoo::getInstance () == "comparison overloaded op"
      

      【讨论】:

      • 虽然是真的,但在单例对象上比较相等性真的有意义吗?
      • 如果相等是一个重载的运算符。也许您正在单例中全局管理某些状态,并且您想查询程序是否处于给定状态?用 something 检查单例是否相等可能有很多原因。它可以很容易地成为一个重载的一元运算符“CFoo::getInstance()++”。该字符串只是一个示例,表明它正在调用重载运算符。
      猜你喜欢
      • 2013-07-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多