zoukankan      html  css  js  c++  java
  • SmartPointer Smar指针

    #include<iostream>

    using namespace std;

    // private class for use by HasPtr only
    class U_Ptr
    {
        /**
        *因为在这个例子中所有的复制都是复制的“变量的常引用”,所以将U_Ptr这个变量的use增加,其他的HasPtr的use也会跟随着改变,
        *【目标变量一直就只有一个,所有的复制都只是改变指针而已】
        */
        friend class HasPtr;
        int *ip;
        size_t use;
        U_Ptr(int *p): ip(p), use(1) { }
        ~U_Ptr() { delete ip; }
    };

    /*** smart pointer class: takes ownership of the dynamically allocated
    *          object to which it is bound
    * User code must dynamically allocate an object to initialize a HasPtr
    * and must not delete that object; the HasPtr class will delete it
    ***/
    class HasPtr
    {
         public:
             // HasPtr owns the pointer; pmust have been dynamically allocated
             HasPtr(int *p, int i): ptr(new U_Ptr(p)), val(i) { }
             // copy members and increment the use count
             HasPtr(const HasPtr &orig):
                    ptr(orig.ptr), val(orig.val) { ++ptr->use; }
             HasPtr& operator=(const HasPtr&);
             // if use count goes to zero, delete the U_Ptr object
             ~HasPtr() { if (--ptr->use == 0) delete ptr; }
         public:
             // copy control and constructors as before
             // accessors must change to fetch value from U_Ptr object
             int *get_ptr() const { return ptr->ip; }
             int get_int() const { return val; }
             // change the appropriate data member
             void set_ptr(int *p) { ptr->ip = p; }
             void set_int(int i) { val = i; }
             // return or change the value pointed to, so ok for const objects
             // Note: *ptr->ip is equivalent to *(ptr->ip)
              int get_ptr_val() const { return *ptr->ip; }
              void set_ptr_val(int i) { *ptr->ip = i; }
              int get_usecount(){return ptr->use;}
         private:
             U_Ptr *ptr;
             // points to use-counted U_Ptr class
             int val;
    };

    HasPtr& HasPtr::operator=(const HasPtr &rhs)
    {
              ++rhs.ptr->use;     // increment use count on rhs first
              if (--ptr->use == 0)
                    delete ptr;    // if use count goes to 0 on this object, delete it
              ptr = rhs.ptr;      // copy the U_Ptr object
              val = rhs.val;      // copy the int member
              return *this;
    }
    int main()
    {
        int obj;cout<<"obj="<<obj<<endl;;

        HasPtr ptr1(&obj,0);cout<<"usecount1="<<ptr1.get_usecount()<<endl;
        HasPtr ptr2(ptr1);cout<<"usecount1="<<ptr1.get_usecount()<<endl;cout<<"usecount2="<<ptr2.get_usecount()<<endl;
        HasPtr ptr3(ptr1);cout<<"usecount1="<<ptr3.get_usecount()<<endl;cout<<"usecount2="<<ptr2.get_usecount()<<endl;

        cout<<"int_A:"<<ptr1.get_int()<<"   int_B:"<<ptr2.get_int()<<"  int_C:"<<ptr3.get_int()<<endl;
        ptr1.set_int(9527); // changes val member only in ptr1
        cout<<"int_A:"<<ptr1.get_int()<<"   int_B:"<<ptr2.get_int()<<"  int_C:"<<ptr3.get_int()<<endl;

        cout<<"ptr_val_A:"<<ptr1.get_ptr_val()<<"   ptr_val_B:"<<ptr2.get_ptr_val()<<"  ptr_val_C:"<<ptr3.get_ptr_val()<<endl;
        ptr1.set_ptr_val(123); // sets object to which both ptr1 and ptr2 point
        cout<<"ptr_val_A:"<<ptr1.get_ptr_val()<<"   ptr_val_B:"<<ptr2.get_ptr_val()<<"  ptr_val_C:"<<ptr3.get_ptr_val()<<endl;

        cout<<"========================================";
    }

  • 相关阅读:
    mysql笔记
    ssh学习笔记
    oracle数据向历史表数据迁移————procedure
    关于避免模糊查询索引时效问题
    css圣杯布局和双飞翼布局篇
    什么是hasLayout
    高度自适应的水平垂直居中布局
    MAC的GIF动图录屏软件LICECAP
    sublime text 快捷键shortcuts
    为表格合并边框的样式
  • 原文地址:https://www.cnblogs.com/bibaodi/p/4314485.html
Copyright © 2011-2022 走看看