【问题标题】:C++: Can you have a static and a non-static instance of the same class when using the Singleton design pattern?C++:使用 Singleton 设计模式时,可以同时拥有同一个类的静态实例和非静态实例吗?
【发布时间】:2022-12-10 01:26:41
【问题描述】:

我试图通过以下代码了解引擎盖下发生的事情。我遇到的问题是:如何在 C++ 中处理类的静态实例?

#include <iostream>

using namespace std;

class Shape {
   public:

      static Shape& getInstance() {
         static Shape obj;
         static Shape& objRef = obj;
         return objRef;
      }

      void init() {
          Shape singleton = Shape::getInstance();
          srand((unsigned)time(0));
          singleton.width = rand()%100;
          singleton.printWidth();
      }

      void printWidth(){
        cout<<width<<endl;
      }
      
   protected:
      int width = 0;
};

int main()
{
   Shape rectangle;
   rectangle.init();
   rectangle.printWidth();
   
   return 0;
}

此代码的输出是:

37
0

但对我来说,这没有意义。如果在程序中的任何地方都创建了 Shape 的静态实例,那么内存中不应该只有一个 Shape 吗?如果在单例设置宽度后任何形状调用printWidth,它们的宽度不应该等于那个宽度吗?

如果能解释我的想法哪里出了问题,我将不胜感激。

【问题讨论】:

  • 你的shape 类不是单身人士。单例具有私有构造函数,因此只有 get_instance 函数可以为您提供单个对象的句柄。
  • getInstance 返回副本,而不是参考。这里面的逻辑也很奇怪。您可能会通读 C++ Singleton design pattern 以获取有关如何正确实现此功能的一些信息。
  • “记忆中的Shape不应该只有一个吗?”不知道你为什么这么想。 main 中的第一行创建了一个实例,getInstance 中有一个静态实例,你在init 中复制它
  • static Shape obj; <--- 这是内存中只存在一次的实例,无论调用该函数的频率如何。
  • 我建议你写一个构造函数Shape() { std::cout &lt;&lt; "Hello WOrld"; }和一个析构函数~Shape() { std::cout &lt;&lt; "Bye!"; }来更好地了解创建了多少实例

标签: c++ class static singleton


【解决方案1】:

根据定义,单例意味着您将只有一个实例。

但是,static 并不能确保它是单身人士。您的代码的 getInstance() 想成为一个通用实例获取器模式:您可以访问一个通用实例,但您也可以根据需要创建(任意多个)实例。因此,您的本地实例 rectangle 不会是 init() 初始化的实例。更糟糕的是,在你的代码中,你返回了一个备份常见实例,而不是对它的引用(例如static Shape&amp; getInstance() 会解决这个问题),所以你有 3 个我们正在谈论的实例:一个在 getInstance() 中,一个在 init() 中,它被打印然后丢弃;和一个主要。如果您使用引用返回修复它,您仍然需要使用引用(由getInstance() 初始化)来使其工作。

【讨论】:

  • 我打错了Shape,是static Shape&amp; getInstance()
猜你喜欢
  • 2018-07-30
  • 2010-10-05
  • 2015-05-31
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多