#include<bits/stdc++.h> using namespace std; template <typename T> class Sharedptr { public: //空参数构造, 空指针 Sharedptr():count(0), ptr((T*) 0){} //构造函数 count 必须new出来 Sharedptr(T* p) : count(new int(1)), ptr(p){} //拷贝构造函数,使其引用次数加一 Sharedptr(Sharedptr<T>& other) : count(&(++ *other.count)), ptr(other.ptr){} //重载operator*和operator->实现指针功能 T* operator->() { return ptr;} T& operator*() { return *ptr; } //重载operator = //如果原来的sharedptr已经有对象,则让其引用对象次数减一并判断引用是否为零(是否调用delete),然后将新的引用对象次数加一 Sharedptr<T>& operator = (Sharedptr<T>& other) { if (this == &other) return *this; ++* other.count; if (this->ptr && 0 == -- * this->count) { delete count; delete ptr; cout << "delete ptr =" << endl; } this->ptr = other.ptr; this->count = other.count; return *this; } //析构函数 使用引用次数减一并判断引用是否为零,即是否调用delete ~Sharedptr() { if (ptr && -- * count == 0) { delete count; delete ptr; cout << "delete ptr ~" << endl; } } int getRef() { return *count; } private: int* count; T* ptr; }; int main(int argc, const char* argv[]) { Sharedptr<string> pstr(new string("abc")); cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; Sharedptr<string> pstr2(pstr); cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl; Sharedptr<string> pstr3(new string("hao")); cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl; pstr3 = pstr2; cout << "pstr:" << pstr.getRef() << " " << * pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl; cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl; return 0; }
自己版本:
#include<bits/stdc++.h> using namespace std; template <typename T> class shareptr { public : shareptr(): count(0),ptr((T*)0){} shareptr(shareptr<T>& x) { count=x.count; (*count)++; ptr=x.ptr; } shareptr<T>& operator =(shareptr<T>& x) { int xx=--(*count); if(xx==0) { delete ptr; delete count; } count=x.count; (*count)++; ptr=x.ptr; return *this; } shareptr(T* x) { count=new int(1); ptr=x; } ~shareptr() { (*count)--; if((*count)==0) { delete count; delete ptr; } } T& operator *() { return *ptr; } T* operator ->() { return ptr; } int getRef() { return *count; } private: int *count ; T* ptr; }; int main() { shareptr<string> pstr(new string("abc")); cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; shareptr<string> pstr2(pstr); cout << "pstr:" << pstr.getRef() << " " << *pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl; shareptr<string> pstr3(new string("hao")); cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl; pstr3 = pstr2; cout << "pstr:" << pstr.getRef() << " " << * pstr << endl; cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl; cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl; return 0; }