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里存放成员变量.


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/articles/2420422.html,如需转载请自行联系原作者
相关文章
|
人工智能 开发框架 安全
龙蜥 2024 年度“最佳合作伙伴”揭晓!申威、AMD 等多家新晋贡献厂商实力登榜
当前,龙蜥社区已实现和操作系统全产业链伙伴从底层硬件支持到上层应用服务优化的全方位深度合作。
|
存储 关系型数据库 MySQL
【超详细】springboot + springdoc-openapi + knife4j 集成案例
springdoc-openapijava库有助于使用 spring boot 项目自动生成 API 文档。 springdoc-openapi通过在运行时检查应用程序以根据 spring 配置、类结构和各种注释推断 API 语义来工作。
|
7天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
3046 20
|
19天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
17094 53
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
14天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
3124 29
|
4天前
|
人工智能 测试技术 API
阿里Qwen3.6-27B正式开源:网友直呼“太牛了”!
阿里云千问3.6系列重磅开源Qwen3.6-27B稠密大模型!官网:https://t.aliyun.com/U/JbblVp 仅270亿参数,编程能力媲美千亿模型,在SWE-bench等权威基准中表现卓越。支持多模态理解、本地部署及OpenClaw等智能体集成,已开放Hugging Face与ModelScope下载。