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++中的String类,为啥直接用于cout就能输出?它里面包含了啥?