句柄(二)

——将句柄与使用者信息分离,以类的形式存在

  1.  计数类:控制计数的类,被嵌入句柄来使用,实现功能分离

  2.  实现代码

     

  1 #include <iostream>
  2 using namespace std;
  3 
  4 // 计数部分
  5 class UseCount
  6 {
  7 private:
  8     int *p;
  9     UseCount& operator=(const UseCount&);
 10 public:
 11     UseCount():p(new int(1)){}
 12     UseCount(const UseCount& u):p(u.p){*p++;}
 13     ~UseCount(){if (--*p==0) delete p;};
 14 
 15     bool only();
 16     bool reattach(const UseCount&);
 17     bool makeonly();
 18 };
 19 
 20 UseCount& UseCount::operator=(const UseCount& u)
 21 {
 22     reattach(u);
 23     return *this;
 24 }
 25 
 26 bool UseCount::only()
 27 {
 28     // 检测句柄是否唯一
 29     return *p==1;
 30 }
 31 
 32 bool UseCount::reattach(const UseCount& u)
 33 {
 34     // 替换句柄指向的对象,当被替换的是唯一的句柄时返回true
 35     ++*u.p;
 36     if (--*p==0)
 37     {
 38         delete p;
 39         p = u.p;
 40         return true;
 41     }
 42     p = u.p;
 43     return false;
 44 }
 45 
 46 bool UseCount::makeonly()
 47 {
 48     // 使该句柄被分离,被替分离的如果是唯一的句柄,那么分离失败
 49     if (*p==1)
 50         return false;
 51     --*p;
 52     p = new int(1);
 53     return true;
 54 }
 55 
 56 // 句柄指向的类
 57 class digit
 58 {
 59 private:
 60     int x;
 61 public:
 62     digit(){}
 63     digit(int x_):x(x_){}
 64     int xx() {return x;}
 65     void xx(int x_){x = x_;}
 66 };
 67 
 68 // 句柄
 69 class handle
 70 {
 71 private:
 72     digit *u;
 73     UseCount p;
 74 public:
 75     handle():u(0){}
 76     handle(int x):u(new digit(x)){}
 77     handle(const digit &dg):u(new digit(dg)){}
 78     handle(const handle &han):u(han.u),p(han.p){}
 79     handle& operator=(const handle& han);
 80     // 存取函数
 81     int x() {return u->xx();}
 82     handle& x(int x_);
 83     ~handle(){if (p.only()) delete(u);}
 84 };
 85 
 86 handle& handle::operator=(const handle& han)
 87 {
 88     if (p.reattach(han.p))
 89         delete(u);
 90     u = han.u;
 91     return *this;
 92 }
 93 
 94 handle& handle::x(int x_)
 95 {
 96     if (p.makeonly())
 97         u = new digit(*u);
 98     u->xx(x_);
 99     return *this;
100 }
101 
102 int main()
103 {
104     handle han1(3);
105     handle han2 = han1;
106     handle han3 = han2;
107     printf("han3: %d\n", han3.x());
108     han3.x(5);
109     printf("han2: %d\n", han2.x());
110     printf("han3: %d\n", han3.x());
111     return 0;
112 }

输出结果为:han3:  3

      han2:  3

      han3:  5

posted @ 2021-09-04 09:28  孱陵  阅读(28)  评论(0编辑  收藏  举报