智慧指標的簡單實現-SharePtr
阿新 • • 發佈:2019-02-07
SharePtr的簡單實現
#include <iostream>
#include<string>
using namespace std;
#pragma warning(disable:4996)
template<class T, class Del>
class SharePtr
{
public:
SharePtr(T* ptr) //建構函式
:_ptr(ptr), _ref(new int(1))
{
cout << "SharePtr(T* ptr) " << endl;
}
SharePtr(SharePtr& cp)//拷貝建構函式
{
cout << "SharePtr(SharePtr& cp)" << endl;
_ptr = cp._ptr;
_ref = cp._ref;
(*_ref)++;
}
~SharePtr()//解構函式
{
Release();
}
void Release()
{
if (--(*_ref) == 0)
{
delete _ref;
_del(_ptr);
}
}
T* operator ->()//->操作符過載
{
return _ptr;
}
T& operator*()//解引用操作符過載
{
return *_ptr;
}
SharePtr& operator=(SharePtr& sp)//賦值操作符過載
{
if (_ptr != sp._ptr)
{
Release();
_ptr = sp._ptr;
_ref = sp._ref;
(*_ref)++;
}
return *this;
}
private:
T* _ptr;
int* _ref;
Del _del;//這是一個物件函式決定著析構時以什麼方式釋放申請的空間
};
//以上為class SharePtr的內容
template<class T>
struct Delete
{
void operator()(T* ptr)
{
cout << "delete" << endl;
delete ptr;
}
};
template<class T>
struct DeleteArr
{
void operator()(T* ptr)
{
cout << "delete[]" << endl;
delete[] ptr;
}
};
template<class T>
struct Free
{
void operator()(T* ptr)
{
cout << "free" << endl;
free(ptr);
}
};
template<class T>
struct Close
{
void operator()(T* ptr)
{
cout << "close" << endl;
if (ptr != NULL)
{
fclose(ptr);
}
}
};
//以上為物件函式
//下面為主函式程式碼
int main()
{
SharePtr<int, Delete<int>> p1(new int(10));
SharePtr<int, Delete<int>> p2(p1);
SharePtr<string, DeleteArr<string>> p3(new string[3]);
SharePtr<string, DeleteArr<string>> p4(p3);
SharePtr<string, DeleteArr<string>> p5(p4);
SharePtr<int, Delete<int>> p6(new int(20));
SharePtr<int, Free<int>> p7 = (int*)malloc(sizeof(int));
SharePtr<FILE, Close<FILE>> p8 = fopen("FILENAME", "r");
cout << *p1 << "," << *p2 << endl;
p2 = p6;
*p1 = 15;
cout << *p1 << "," << *p2 << endl;
return 0;
}
結果為