句柄类的实现,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; }