zoukankan      html  css  js  c++  java
  • 句柄类的实现,robby 难道你还能忘记么?第几遍了已经!

    为了避免每个使用指针的类自己去控制引用计数,可以用一个类把指针封装起来。这个类对象可以出现在用户类使用指针的任何地方。
    #include <iostream>
    #include <cstdio>
    #include <stdexcept>
    
    using namespace std;
    
    template <typename T>
    class Handle {
    private :
    	T *ptr;
    	size_t *use;
    	void decrUse() {
    		--(*use);
    		if(*use == 0) {
    			delete ptr;
    			delete use;
    		}
    	}
    public :
    	Handle(T *p = 0) : ptr(p), use(new size_t(1)) {}
    	Handle(const Handle& rhs) : ptr(rhs.ptr), use(rhs.use) { ++(*use); } // 初始化用到
    	Handle& operator= (const Handle& rhs) { // 覆盖以前的值
    		++(*rhs.use);
    		decrUse();
    		ptr = rhs.ptr;
    		use = rhs.use;
    		return *this;
    	}
    	T* operator-> () {
    		if(ptr) return ptr;
    		throw std::runtime_error("NULL point");
    	}
    	const T* operator-> () const {
    		if(ptr) return ptr;
    		throw std::runtime_error("NULL point");
    	}
    	T& operator* () {
    		if(ptr) return *ptr;
    		throw std::runtime_error("NULL point");
    	}
    	const T& operator* () const {
    		if(ptr) return *ptr;
    		throw std::runtime_error("NULL point");
    	}
    	~Handle() {
    		decrUse();
    	}
    };
    class A {
    public :
    	void show() {
    		printf("Hello! , I am A!!! \n");
    	}
    };
    int main() {
    	try {
    		Handle<A> t(new A);
    		t->show();
    	} catch (const exception& err) {
    		cout << err.what() << endl;
    	}
    	return 0;
    }

  • 相关阅读:
    C博客作业02--循环结构
    博客作业01--顺序分支结构
    C博客作业00--我的第一篇博客
    实验四
    实验三
    网络管理snmp实验
    C语言博客作业02--循环结构
    C博客作业03--函数
    循环结构
    C语言博客作业02--循环结构
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786690.html
Copyright © 2011-2022 走看看