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,默认,...
我从一个前同事那里继承了一个项目,我找到了这些代码片段(以及一些类似的 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,默认,...