博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一段有意思的代码:类实现中将信息存储到其他位置
阅读量:5818 次
发布时间:2019-06-18

本文共 1286 字,大约阅读时间需要 4 分钟。

     今天在看《C++ Strategies and Tactics》的时候发现了一段非常有意思的代码:

1 class Complex_rep { 2 private: 3     friend class Complex; 4     double real_d; 5     double image_d; 6     Complex_rep(double r, double i) : real_d(r), image_d(i) { 7          8     } 9 };10 11 class Complex {12 private:13     Complex_rep *rep;14 public:15     Complex(double r, double i)16         :rep(new Complex_rep(r, i)) {}17     ~Complex() { delete rep; }18 };

     可以看到Complex表示复数(complex)数据结构,但是有意思的是数据成员(复数的实部和虚部)并没有存储在Complex内部,而是在一个Complex_rep类中。在Complex_rep中将Complex声明为友元类,这样Complex就可以访问Complex_rep中的所有成员和方法。同时将Complex_rep的构造函数声明为private类型,这样在类体外部就不能Complex_rep的实例,只能通过友元类Complex创建。

     这样表示的意义是说,Complex_rep是类Complex所独有的,只能通过Complex创建和访问,别的任何类都不能创建Complex_rep实例。

(往下看第三章的时候才知道这种方法在C++中叫做 句柄 (handle))。

 

     将构造函数声明为private的技巧在设计模式的“Singleton模式”也有应用,一个Singleton类定义如下:

1 class Singleton { 2 public: 3     static Singleton* instance(); 4 protected: 5     Singleton(); 6 private: 7     static Singleton* _instance; 8 }; 9 10 Singleton* Singleton::_instance = 0;11 12 Singleton* Singleton::instance() {13     if(_instance == 0) {14         _instance = new Singleton;15     }16     return _instance;17 }

     客户仅通过instance()成员函数访问这个单件。变量_instance初始化为0,而静态成员函数interface()返回其变量值,如果其值为0则用唯一实例初始化它。instance()使用惰性(lazy)初始化:_instance直到第一次被访问时才会创建和保存。

转载地址:http://bggbx.baihongyu.com/

你可能感兴趣的文章
802.11 学习笔记
查看>>
Leetcode-Database-176-Second Highest Salary-Easy(转)
查看>>
构建Docker Compose服务堆栈
查看>>
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
CentOS7下zip解压和unzip压缩文件
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>
如何基于Redis Replication设计并实现Redis-replicator?
查看>>
Linux 环境下 PHP 扩展的编译与安装 以 mysqli 为例
查看>>
laravel中 url() route() URL::asset()
查看>>
浮点数内存如何存储的
查看>>
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
vue
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
【状压DP】【UVA11825】 Hackers' Crackdown
查看>>