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安装问题
    决策树算法实现
    安装scipy失败提示lapack not found
    算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)简介
    VMware 注册码
    chrome浏览器频繁卡死
    dell装系统
    关于scipy包的安装
    pip安装python包时报字符编码错
    linux中mv命令使用详解
  • 原文地址:https://www.cnblogs.com/bibaodi/p/4314485.html
Copyright © 2011-2022 走看看