设计模式之pimpl惯用法C语言版(城门失火 殃及池鱼)
来源:互联网 发布:嵌入式 linux 忘记密码 编辑:程序博客网 时间:2024/04/30 10:33
我们平时无意中就使用了pimpl模式,pimpl即pointer to implementation,“指向实现的指针”缩写,主要避免在头文件中暴露私有细节,降低编译依赖,促进API接口和实现的完全分离的重要方法。
比如我们有个打印几个数据的api,
头文件pimpl_pattern.h
#ifndef __PIMPL_PATTERN_H__#define __PIMPL_PATTERN_H__void dump(int nA,int nB,int nC);#endif
.c文件
pimpl_pattern.c
#include ”pimpl_pattern.h”void dump(int nA,int nB,int nC){printf("\n auto a=%d ,b=%d \n",nA,nB, nC);}
调用形式:
dump(nA,nB,nC);
Now,我们有一个新需求,要求把第一个参数改成字符串,第一个参数改成float,
那接口岂不是得改成:
void dump(char * nA,float nB, int nC);
,当然,所有调用dump的模式都得改是不是。
使用不透明指针,即pimpl用法,通过在头文件定义不透明指针auto_pimpl_t *。
对外隐藏细节,任何时候去扩展dump函数,都不会影响外部模块对dump函数的
调用。我们可以非常方便的在.c文件去扩展auto_pimpl_t *指针的结构体成员。
头文件
pimpl_pattern.h
#ifndef __PIMPL_PATTERN_H__#define __PIMPL_PATTERN_H__typedef struct auto_pimpl auto_pimpl_t;void dump(auto_pimpl_t *pAutoPimpl);#endif
.c文件
pimpl_pattern.c
#include ”pimpl_pattern.h”#include <stdio.h>#include "pimpl_pattern.h"typedef struct auto_pimpl{int m_nA;int m_nB;int m_nC;}auto_pimpl_t;void dump(auto_pimpl_t *pAutoPimpl){if(NULL == pAutoPimpl){return;}printf("\n auto a=%d ,b=%d c=%d \n",pAutoPimpl->m_nA,pAutoPimpl->m_nB,pAutoPimpl->m_nC);}int main(){auto_pimpl_t AutoPimpl;AutoPimpl.m_nA = 0;AutoPimpl.m_nB = 2;AutoPimpl.m_nC =4;dump(&AutoPimpl);return 0;}
另外,降低#include的依赖性,
1)永远不用用#include包含不必要的头文件;
2)只需要前置声明时,绝不需要用#include包含相应的头文件;
阅读全文
0 0
- 设计模式之pimpl惯用法C语言版(城门失火 殃及池鱼)
- 设计模式之pimpl惯用法C++版
- 城门失火,殃及池鱼
- Bridge模式/ Pimpl惯用法 实例
- 设计模式之PIMPL
- pimpl 惯用法的背后
- 设计模式(四)C语言版
- 重构 — 改善既有的类图设计 条款9:用Pimpl惯用法隐藏细节
- 编译防火墙——C++的Pimpl惯用法解析
- 编译防火墙——C++的Pimpl惯用法解析
- Exceptional C++读书笔记:编译器防火墙与Pimpl惯用法(一)
- 实现私有化(Pimpl) --- QT常见的设计模式
- Python的惯用法技巧和创建型设计模式
- C/C++惯用法
- C++实现设计模式: PIMPL IDIOM
- PIMPL设计模式的理解和使用
- 柴郡猫技术--C++中的PIMPL设计模式
- 条款31提及pimpl设计模式
- LED PWM控制芯片PCA9685的Linux 驱动
- set in Python
- mysql动态扩容调研
- python中的装包与拆包
- 自己定义CNN网络模型并使用caffe训练
- 设计模式之pimpl惯用法C语言版(城门失火 殃及池鱼)
- C++&系统 异常
- c++ 宏
- Cpp.Study.Note.初识 Cpp中的类
- MyEclipse导入 Java Web工程
- 基于JQ 根据输入内容自适应输入框高度 支持输入增高 渲染时设置高度和内容一致
- 网络安全知识之对称加密与base64
- hadoop2.x概览
- Spring整合Ehcache管理缓存