PIMP模式的理解
看了【C++程序设计技巧】Pimpl机制 之后,想了半天才理解
// MyClass.h
2: class MyClassImpl; // forward declaration
3: class MyClass {
4: public:
5: MyClass();
6: ~MyClass();
7: int Action1();
8: private:
9: MyClassImpl *m_pImpl;
10: };
1: // MyClass.cpp
2: class MyClassImpl {
3: public:
4: int foo() {
5: return bar();
6: }
7: int bar() { return var++; }
8: int var;
9: };
10:
11: MyClass::MyClass() : m_pImpl(new MyClassImpl){}
12:
13: MyClass::~MyClass()
14: {
15: try {
16: delete m_pImpl;
17: }
18: catch (...) {}
19: }
20:
21: int MyClass::foo(){ return m_pImpl->foo(); }
这个模式下 MyClass 应该全部是公有接口 因为私有接口都放到 MyClassImpl 里面去实现了
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
上面的代码 的意思 MyClass 的接口是不能变的
每个类似 foo这样的函数 都是通过 调用m_pImpl->foo() 来实现的 而因为MyClassImpl 是前置声明 所以不会产生依赖
所以 不管你在MyClassImpl 里面怎么修改 只要保持 m_pImpl::foo() 之类的函数 还在
那foo()的内容就可以随便更改 加一个变量返回 然后返回那个变量时可以 加一个函数 然后返回那个函数 也是可以的
这些修改有个前提就是 MyClass的公有接口不会变 这就是 得到稳定接口的意思
最新文章
- Intellij IDEA 一些不为人知的技巧
- 清理mac本内存
- linux vim
- Spring入门
- Mina工作原理分析
- ObjectID和Handle
- Spring 4.1+ 的 JSONP使用
- js中Array自定义contains, indexOf, delete方法.
- 漫游Kafka实现篇之分布式
- 学习Slim Framework for PHP v3 (七)--route middleware怎么被add进来的?
- Count属性(行数 @)
- Linux下Java 编译运行说明
- java 加载图片的几种方式
- C#数据绑定中,时间为空时显示时间为原始日期问题
- sqlite3命令行
- Linux 快捷键使用
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)
- java序列化测试
- js/jq动态创建表格的行与列
- 解决CentOS中/var目录满的问题