gpt4 book ai didi

c++ - Singleton - 为什么使用类?

转载 作者:IT老高 更新时间:2023-10-28 22:21:12 25 4
gpt4 key购买 nike

就在前几天,我看到了使用所谓的单例模式的代码。意思类似于

class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};

我明白为什么要这样做:

  • 使实例可全局访问。
  • 确保该类的实例不超过一个。

但是我不明白为什么这种做事方式优于几个免费功能。我实现它的方式是把

namespace some_name{
void foo();
}

在标题中和

namespace some_name{
void foo(){
...
}
}

在实现文件中。如果我需要初始化和/或清理,我要么添加一些必须显式调用的函数,要么添加

namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}

进入实现文件。

我知道从语义的角度来看这是单例,但是我发现第一个变体在 C++ 代码中的使用频率远高于第二个。为什么?我认为第二个版本略胜一筹,所以我问自己是否遗漏了一些明显的东西。

  • 第二个版本更易于实现且不易出错。在第一个变体中,为了证明这一点,专用复制构造函数被遗漏了。在第二个变体中,无法解决此错误。
  • 在第二个版本中实现和接口(interface)更好地分开。首先,必须在 header 中声明所有私有(private)成员。这样做的好处是您可以从头开始重写实现,甚至不需要重新编译任何使用单例的东西。使用第一个变体时,您很可能必须重新编译所有用户代码,即使只更改轻微的实现细节。
  • 在这两种情况下都隐藏了实现细节。在第一个变体中使用私有(private)命名空间,在第二个变体中使用未命名的命名空间。

你能解释一下为什么每个人都使用第一个变体吗?我看不出比用 C 语言做事的旧方法有任何优势。

最佳答案

根据党的路线(E. Gamma、R. Helm、R. Johnson 和 J. Vlissides。Design Patterns: Elements of Reusable Object-Oriented Software . Addison-Wesley,Reading,MA,1995 年,第 128 页),单例提供以下优于您提出的解决方案。

  • 您可以优化操作和表示,例如通过子类化。
  • 您可以在稍后改变主意并拥有多个实例。
  • 您可以多态地覆盖单例的方法。
  • 您可以在运行时通过使用您需要的类初始化单例实例来配置您的应用程序。

话虽如此,在大多数情况下,我认为额外的复杂性过多,并且很少在我编写的代码中使用该模式。但是当你设计一个其他人会使用的 API 时,我可以看到它的值(value)。

关于c++ - Singleton - 为什么使用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com