C++ class 包含一个与自身类型相同的静态成员。为什么是这种模式?

A c++ class include a static member with the same type of itself. Why this pattern?

我从一个前同事那里继承了一个项目,我找到了这些代码片段(以及一些类似的 SO 问题:can a c++ class include itself as an member and static member object of a class in the same class

// Service.h
class Service
{
// ...
public:
    static Service sInstance;
    void Somememberfunc();
//...
};

// Service.cpp
#include "Service.h"

Service Service::sInstance;

void Service::Somememberfunc()
{
//...
}

// Main.cpp
#include "Service.h"
void Fun()
{
    Service &instance = Service::sInstance;
    //...
    instance.Somememberfunc();
    //...
}

但是,我没有找到关于何时使用此模式的任何解释。以及优缺点是什么?

这个在单例设计模式中经常用到 访问 https://en.wikipedia.org/wiki/Singleton_pattern

单例模式。例如,您可以使用它来存储您的应用程序配置。然后您可以在您的应用程序中的任何地方(全局)轻松访问配置。

请注意,该成员是静态成员,因此它是 class 的一部分,而不是实例化对象的一部分。这很重要,因为否则你会尝试创建一个递归成员(因为该成员是对象的一部分,它也包含相同的成员等等......),但这里不是这种情况。

对此进行描述的最佳模式是:全局变量。静态成员在 main() 之前初始化,并且可以通过包含头文件从程序的任何部分访问。这在实施时非常方便,但程序越复杂,维护时间越长,就越难处理,因此一般的想法是避免这种情况。另外,由于无法控制初始化顺序,不同全局变量之间的依赖关系会导致启动过程中出现问题。

静态成员大致是class的作用域中的全局变量。

静态成员还具有可见性访问的优势 (public/protected/private) 以限制其使用(文件范围可能是替代方案)。

该成员可能属于 class 类型。

全局“容易”(误)使用,因为它们不需要考虑体系结构。

但是(可变的)全局变量大多不鼓励,因为更难推理。

IMO 可接受的用法是 常量:

  • 对于一个矩阵class,空矩阵,对角一矩阵。
  • 对于温度 class,一些特定值(绝对值 0 (O Kelvin),水转化温度(0 摄氏度,100 摄氏度),...)
  • 一般为 NullObject,默认,...