#include <iostream>
using namespace std;
template <typename T>
class SharedPtr
{
private:
T* p;
int* pCount;
public:
SharedPtr();
SharedPtr(T* p);
SharedPtr(SharedPtr& rSp);
~SharedPtr();
public:
SharedPtr& operator=(SharedPtr& rSp);
T operator*();
void rest(T* p = nullptr);
T* get();
int use_count();
};
template <typename T>
SharedPtr<T>::SharedPtr()
{
p = nullptr;
pCount = nullptr;
}
template <typename T>
SharedPtr<T>::SharedPtr(T* p)
{
this->p = p;
this->pCount = new int(1);
}
template <typename T>
SharedPtr<T>::SharedPtr(SharedPtr& rSp)
{
this->p = rSp.p;
this->pCount = rSp.pCount;
(*pCount)++;
}
template <typename T>
SharedPtr<T>::~SharedPtr()
{
(*pCount)--;
if (*pCount == 0)
{
delete pCount;
pCount = nullptr;
delete p;
p = nullptr;
}
}
template <typename T>
SharedPtr<T>& SharedPtr<T>::operator=(SharedPtr& rSp)
{
this->p = rSp.p;
this->pCount = rSp.pCount;
(*pCount)++;
return *this;
}
template <typename T>
T SharedPtr<T>::operator*()
{
return *(this->p);
}
template <typename T>
void SharedPtr<T>::rest(T* p)
{
(*pCount)--;
if ((*pCount) == 0)
{
delete pCount;;
delete this->p;
}
this->p = nullptr;
pCount = nullptr;
if (p != nullptr)
{
this->p = p;
pCount = new int(1);
}
}
template <typename T>
T* SharedPtr<T>::get()
{
return this->p;
}
template <typename T>
int SharedPtr<T>::use_count()
{
if (pCount == nullptr)
{
return 0;
}
return *pCount;
}
int main()
{
SharedPtr<int> sp1(new int(100));
SharedPtr<int> sp2 = sp1;
SharedPtr<int> sp3;
sp3 = sp1;
cout << sp3.use_count() << endl;
return 0;
}
Shared_ptr实现
最新推荐文章于 2024-07-12 16:34:36 发布