C++中的智能引用指针类,可以和STL配合使用

王朝c/c++·作者佚名  2006-01-09
宽屏版  字体: |||超大  

template <class T>

class ref_ptr{

private:

T* ptr;

long * ct;

void dispose() {

if(--*ct <= 0) {

delete ct;

delete ptr;

}

}

public:

//从 new 得到指针的构造函数

explicit ref_ptr(T* p)

: ptr(p), ct(new long(1)) { }

explicit ref_ptr(const T& t)

: ptr(new T), ct(new long(1)) {

*ptr = t;

}

//从另一个指针得到数据的构造函数

ref_ptr(const ref_ptr<T>& p) throw()

: ptr(p.ptr), ct(p.ct) { ++*ct; }

//析构函数

~ref_ptr() { dispose(); }

//赋值运算符

ref_ptr<T>& operator=(const ref_ptr<T>& p) throw() {

if(this!=&p)

{

dispose();

ptr = p.ptr;

ct = p.ct;

++*ct;

}

return *this;

}

//赋值,从原生对象

ref_ptr<T>& operator=(const T& t) throw() {

dispose();

ptr = new T;

*ptr = t;

ct = new long;

*ct = 1;

return *this;

}

//复制新对象,建立新拷贝,前缀运算符

const ref_ptr<T>& operator++() throw() {

if(*ct > 1)

{

T* tmp = new T;

long* tct = new long;

*tmp = *ptr;

*tct = 1;

dispose();

ptr = tmp;

ct = tct;

}

return *this;

}

//复制新对象,建立新拷贝,后缀运算符

const ref_ptr<T>& operator++(int) throw() {

return ++(*this);

}

//指针对象运算符,返回对象引用

T& operator*() const throw() {

return *ptr;

}

//返回对象指针

T* operator->() const throw() {

return ptr;

}

//返回对象引用,类型转换

operator T() const throw() {

return *ptr;

}

};

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有