zoukankan      html  css  js  c++  java
  • 句柄(二)

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

      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
    ", han3.x());
    108     han3.x(5);
    109     printf("han2: %d
    ", han2.x());
    110     printf("han3: %d
    ", han3.x());
    111     return 0;
    112 }

    输出结果为:han3:  3

          han2:  3

          han3:  5

  • 相关阅读:
    Windows7 共享文件夹的两个BUG
    POJ 1845 Sumdiv(数论,求A^B的所有约数和)
    POJ 2481 Cows(树状数组)
    HDU 1124 Factorial(简单数论)
    POJ 1195 Mobile phones(二维树状数组)
    POJ 3067 Japan(树状数组求逆序对)
    HDU 4027 Can you answer these queries?(线段树)
    HDU 1576 A/B(数论简单题,求逆元)
    HDU 1166 敌兵布阵(线段树,树状数组)
    ZOJ 1610 Count the Colors(线段树)
  • 原文地址:https://www.cnblogs.com/suui90/p/15225557.html
Copyright © 2011-2022 走看看