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

Posted

技术标签:

【中文标题】c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?【英文标题】:A c++ class include a static member with the same type of itself. Why this pattern?c++ 类包含一个与自身类型相同的静态成员。为什么是这种模式? 【发布时间】:2021-03-17 10:15:19 【问题描述】:

我从一位前同事那里继承了一个项目,我发现了这些代码 sn-ps(以及 SO questions 中的一些类似代码:can a c++ class include itself as an member 和 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();
    //...

但是,我没有找到关于何时使用此模式的任何解释。又有哪些优点和缺点?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的回复。如果构造函数是私有的,我能说这种模式类似于c#中的静态类吗?【参考方案2】:

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

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

那个成员可能是类的类型。

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

但(可变)全局通常不鼓励,因为它更难推理。

IMO 可接受的用法是常量

对于矩阵类,零矩阵,对角线一矩阵。 对于温度等级,一些特定值(绝对 0 (O Kelvin),水转变温度(0 摄氏度,100 摄氏度),...) 一般来说 NullObject、Default、...

【讨论】:

【参考方案3】:

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

【讨论】:

这可能会产生误导。 OPs 代码中的类绝不是单例 @largest_prime_is_463035818:可能是,有很多未显示的代码。但无论如何,这并不能回答 OP。 @Jarod42 是的,可能是,我的意思是 OP 是在问“当一个类有一个自己类型的静态成员时,模式是什么”,而且迂腐地说,这不是单例模式跨度> @largest_prime_is_463035818 感谢您的回复。如果构造函数是“私有的”,它可以是单例吗?【参考方案4】:

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

【讨论】:

这里有同样的评论:这可能有点误导,因为 OPs 代码中的类不是单例

以上是关于c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?的主要内容,如果未能解决你的问题,请参考以下文章

类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型

C++ 为啥 Traits 在对象上不可用,而是作为静态成员变量可用

C++ 静态与 C 中的静态相同吗? [复制]

c++中的String类,为啥直接用于cout就能输出?它里面包含了啥?

C++中静态成员变量(不支持在类定义中初始化不是常量的静态数据成员)

为啥相同的语句不适用于 C++ 中的类成员?