c++ - c++ 类包含一个与自身类型相同的静态成员。为什么是这种模式?
问题描述
我从一位前同事那里继承了一个项目,我发现了这些代码片段(以及 SO questions 中的一些类似的片段:c++ 类是否可以将自身作为同一类中的类的成员和静态成员对象包含在内)
// 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();
//...
}
但是,我没有找到关于何时使用此模式的任何解释。有哪些优点和缺点?
解决方案
请注意,该成员是静态的,因此它是类的一部分,而不是实例化对象的一部分。这很重要,因为否则您将尝试创建一个递归成员(因为该成员是对象的一部分,它也包含相同的成员等等......),但这里不是这种情况。
描述这一点的最佳模式是:全局变量。静态成员在 main() 之前初始化,并且可以通过包含头文件从程序的任何部分访问。这在实现时非常方便,但程序越复杂,维护的时间越长,就越难处理,所以总体思路是避免这种情况。此外,由于无法控制初始化的顺序,不同全局变量之间的依赖关系可能会导致启动过程中出现问题。
推荐阅读
- ios - 在 Expo iOS 客户端上未收到推送通知
- selenium - 机器人框架的运行机制是什么?为什么不执行代码?
- python - 在 Python 中按参数合并两个字典列表
- javascript - 从对象数组中获取属性
- java - 带有 Gradle 自定义运行时映像的 SQLite JDBC
- ruby-on-rails - 以感叹号结尾的锁的含义
- devenv - 使用特定配置和平台打开 Visual Studio
- ibm-cloud - API Connect 2018 VMware 部署:“主机缺少流量接口”错误
- ssis - SSDT Microsoft.AnalysisServices.Server 连接抛出“值不能为空错误”
- java - SpringBoot,如何根据每个控制器或请求映射设置 MultipartFile 大小限制