c++ 智能指针 简单实现

1.需要设计

智能指针实现,目标用一个对象管理指针。
指针类:B
智能指针类A<T>
A<B> a(new B);
用A来管理B的指针,如果有多个指针指向一个对象,那么都用A来承载这个指针
A<B> b(a);
这里需要一个拷贝构造函数,为什么不用赋值运算符的,两个智能指针赋值将不会有任何价值,所以重载赋值运算符没有任何意义,这里通过拷贝构造函数来实现一个新的指针的产生。

经历上面的智能指针拷贝构造后,会产生多个指针指向同一个对象的情况,如果一个对象删除了,就会出现指针悬垂的情况。这里添加一个delet_c函数来控制指针的删除,另外因为智能指针对象的创建是创建在栈上,为了借用堆对象析构时候对指针的控制,这里在析构函数也做了控制,这里为了模拟对象析构的过程,也用一个函数模拟了"delete 指针"的行为。

2.代码

#include <iostream>
using namespace std;

namespace T1 {
    //智能运算符重载,智能指针的基础
    class  B
    {
    public:
        void fun() {
            cout << "fun\n";
        }
    };
    template<class T>
    class  A
    {
    public:
        void set(T* t) {
            this->t = t;
        }
        /// <summary>
        /// 重载运算符,智能指针的基础
        /// </summary>
        /// <returns></returns>
        T* operator->() {
            return t;
        }
        T* t;
    };
    void main() {
        A<B> pa;
        pa.set(new B());
        pa->fun();
    }
}
namespace T2 {
    //用构造函数和析构函数控制指针的生命周期
    class  B
    {
    public:
        void fun() {
            cout << "fun\n";
        }
    };
    template<class T>
    class  A
    {
    public:
        /// <summary>
        /// 用构造函数控制指针的生命周期
        /// </summary>
        /// <param name="t"></param>
        A(T* t) {
            this->t = t;
        }
        /// <summary>
        /// 析构函数,释放奶茶
        /// </summary>
        ~A() {
            delete t;
        }
        T* operator->() {
            return t;
        }
        T* t;
    };
    void main() {
        A<B> pa(new B());
        pa->fun();
    }
}
namespace T3 {
    
    class  B
    {
    public:
        void fun() {
            cout << "fun\n";
        }
    };
    template<class T>
    class  A
    {
    public:
        A(T* t) {
            this->t = t;
            //创建一个堆中的内存
            tsum = new int(0);
        }
        /// <summary>
        /// 用拷贝构造函数,控制指针被拷贝的次数
        /// </summary>
        /// <param name="object"></param>
        A(const A<T>& object) {
            this->t = object.t;
            this->tsum = object.tsum;
            (*tsum)++;
        }
        ~A() {
            //如果之前进行过指针的释放了,那么这里不需要释放了
            if (isdelet) {
                return;
            }
            delete t;
        }
        
        T* operator->() {
            return t;
        }
        T* t;
        int* tsum;
        void delete_t() {
            //t == NULL:防止以外的delete
            //isdelet==true:一个指针如果释放过一次,就不需要再次释放了
            if (t == NULL|| isdelet==true) {
                return;
            }
            //执行过指针释放了,那么析构函数的时候就不需要释放指针了
            isdelet = true;
            if (*tsum > 0) {
                (*tsum)--;
            }
            else
            {
                delete t;
                t == NULL;
            }
        }
    private:
        //释放释放过
        bool isdelet = false;
        //对于单纯的指针,赋值没有任何意义
        A& operator =(const A& a) = delete;
        /*
        A& operator =(const A& a) {
            //t = a.t;
            return *this;
        }*/
    };
    void main() {
        A<B> pa(new B());
        A<B> pb(pa);
        //A<B> pc(pb);
        pa->fun();
        //pa = pb;
        pa.delete_t();
        pb.delete_t();
    }
}
int main()
{
    //T1::main();
    //T2::main();
    T3::main();
    cout << "Hello World!\n";
}

3.运行结果

fun
Hello World!

  • 31
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值