Pimpl常用法

简介:

对于规模较大的C++项目,头文件的互包含和互依赖关系经常困扰开发者.例如:
class foo
{
public:
foo();
void method_foo_b(const foo_a& b);
private:
void method_foo_c(const foo_b& c);
private:
foo_b b_;
foo_c c_;
};

int main(...)
{
foo fooi;
}
如果要使得main或者一个必须包含foo的class通过编译,则不仅需要包含foo头文件,还必须包含foo_b, foo_c的头文件.而实际上foo_b, foo_c是foo内部使用的类,完全不需要外部调用着关心.而且这样做带来两个问题:
1. 大量的依赖包含或者互包含带来更多的编译错误和更长的编译时间,对于大项目,其编译时间可能让人无法承受.
2. 实际上暴露了部分内部实现,违背OO封装的原则.

有些人通过继承纯续接口类的方法解决,但对于实际上并不存在多态概念的类而言,使用续基类来封装接口完全是多余的,增加不必要的虚函数开销和维护开销.
Pimpl用了只有一个实现的Bridge模式解决了这一问题.
class foo
{
public:
foo();
void method_foo_b(const foo_a& b);
private:
struct Pimpl;
boost::scoped_ptr pimpl_ptr_;
};
只出现公有接口,自己用的私有函数和成员变量完全被隐藏.
struct foo::Pimpl
{
void method_foo_b(const foo_a& b) {...};
void method_foo_c(const foo_b& c) {...};
}
void foo::method_foo_b(const foo_a& b)
{
pimpl_ptr_->method_foo_b(b);
}

个人经验,使用Pimpl有几个需要注意的地方,
1. 不要滥用,终究还是增加了一个间接的层次,尽量只在模块的边界使用.
2. 对于内部操作比较复杂的类, 应该把操作移到pimpl里执行,对于非常简单的类,可以只在pimpl里存放成员变量.


目录
相关文章
|
人工智能 自然语言处理 测试技术
Claude 3非常厉害,但是国内用不上怎么办?
【2月更文挑战第16天】Claude 3非常厉害,但是国内用不上怎么办?
4662 1
Claude 3非常厉害,但是国内用不上怎么办?
|
消息中间件 安全 Kafka
2024年了,如何更好的搭建Kafka集群?
我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。
3325 2
2024年了,如何更好的搭建Kafka集群?
|
缓存 负载均衡 监控
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
不知道什么是网关?正向代理?反向代理?负载均衡?负载均衡策略?Nginx和Gateway的区别?假如这些你都不知道,没关系,本文举了大量通俗易懂的例子来阐述了这些概念,保证小白也能看懂,并且最后还提到了gateway的一些配置。
8370 2
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
|
人工智能 自然语言处理 安全
claude国内怎么用?教你两种claude国内使用方法!
Claude AI 是由 Anthropic 公司开发的一款新一代 AI 助手,旨在成为更安全、更友好、更可靠的 AI 系统。它基于 Anthropic 对 AI 安全性的深入研究,并采用 “Constitutional AI” (宪法式 AI) 的训练方法,使其行为更符合人类价值观,并减少有害输出的可能性。 🛡️
|
敏捷开发 前端开发 测试技术
软件开发工作流【详解】(含公司产品研发流程图、大厂研发架构图、大厂研发流程图)
软件开发工作流【详解】(含公司产品研发流程图、大厂研发架构图、大厂研发流程图)
5997 1
|
域名解析 移动开发 运维
Nacos 集群部署模式最佳实践
本文介绍了 Nacos 的三种部署模式,并就高可用、可伸缩、易用性等方面对各个模式进行介绍。
13244 106
Nacos 集群部署模式最佳实践
|
存储 负载均衡 网络协议
FastDFS——从入门到入土
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据存储和负载均衡等问题。特别适合以中小文件为载体的在线服务,如相册网站、视频网站等等
|
消息中间件 存储 监控
性能调优|生产环境kafka集群400W/tps为啥就扛不住了?
性能调优|生产环境kafka集群400W/tps为啥就扛不住了?
性能调优|生产环境kafka集群400W/tps为啥就扛不住了?
|
12天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1273 5