• 一段有意思的代码:类实现中将信息存储到其他位置


         今天在看《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直到第一次被访问时才会创建和保存。

  • 相关阅读:
    JS 使用 html2canvas 将页面转PDF
    代码记录
    js 原生图片批量上传 multiple="multiple"
    Go中的HTTP debug技能
    位运算 交换2个数 异或运算
    记一次 JMeter 压测 HTTPS 性能问题 拂衣 阿里云云栖号 20220527 19:00 发表于北京
    RVA relative virtual address PE
    进制
    浏览器是不允许页面直接读取本地硬盘资源的
    四平方和定理
  • 原文地址:https://www.cnblogs.com/wanghetao/p/3077636.html
Copyright © 2020-2023  润新知