看了【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的公有接口不会变   这就是 得到稳定接口的意思

最新文章

  1. Intellij IDEA 一些不为人知的技巧
  2. 清理mac本内存
  3. linux vim
  4. Spring入门
  5. Mina工作原理分析
  6. ObjectID和Handle
  7. Spring 4.1+ 的 JSONP使用
  8. js中Array自定义contains, indexOf, delete方法.
  9. 漫游Kafka实现篇之分布式
  10. 学习Slim Framework for PHP v3 (七)--route middleware怎么被add进来的?
  11. Count属性(行数 @)
  12. Linux下Java 编译运行说明
  13. java 加载图片的几种方式
  14. C#数据绑定中,时间为空时显示时间为原始日期问题
  15. sqlite3命令行
  16. Linux 快捷键使用
  17. 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)
  18. java序列化测试
  19. js/jq动态创建表格的行与列
  20. 解决CentOS中/var目录满的问题

热门文章

  1. Linux查看系统版本信息的
  2. 重装mysql步骤
  3. linux进程的几种状态
  4. 个性CMD设置方法(转载)
  5. ksh和bash区别
  6. codeforce 621A Wet Shark and Odd and Even
  7. HTML 网页游戏 2048
  8. storm核心组件
  9. Supervisor的安装与使用入门
  10. 启用PowerShell Web Access