#ifndef SMARTPTR_H_
#define SMARTPTR_H_
template<typename T>
struct SmartPtr
{
explicit SmartPtr(T* ptr = nullptr) : dumpPtr(ptr){}
explicit SmartPtr(const SmartPtr& rhs)
{
if (this != &rhs)
{
dumpPtr = rhs.operator ->();
}
}
~SmartPtr()
{
if (dumpPtr)
{
delete dumpPtr;
}
}
SmartPtr& operator=(const SmartPtr& rhs)
{
if (this != &rhs)
{
if (dumpPtr)
delete dumpPtr;
dumpPtr = rhs.operator ->();
}
return *this;
}
T* operator->() const
{
return dumpPtr;
}
T& operator*() const
{
return *dumpPtr;
}
private:
T* dumpPtr;
};
#endif
#include <iostream>
#include "SmartPtr.h"
using namespace std;
struct Pig
{
void Print()
{
cout << "this is pigsy" << endl;
}
~Pig()
{
cout << "Kill the pigsy" << endl;
}
};
int main(int argc, char **argv)
{
SmartPtr<Pig> pigsy(new Pig());
pigsy->Print();
pigsy.operator *().Print();
return 0;
}