#include <iostream>
using namespace std;

template<class T>
class shr_ptr
{
        T* resource;
        int* count; 
public:
        shr_ptr():resource(NULL),count(NULL)
        {
                
        } 

        shr_ptr(T* res):resource(res)
        {
                count = new int(1);
        } 

        shr_ptr(const shr_ptr<T>& R)
        {
                if(R.resource!=NULL)
		{
			resource = R.resource;
			count = R.count;
			*count = *R.count+1;
		}
        } 

        ~shr_ptr()
        {
                if(resource!=NULL && --*(count)==0)
		{
			delete resource;
			delete count;
			resource = NULL;
		}
        }
       
       shr_ptr<T>& operator = (const shr_ptr<T>& R)
       {
                if(R.resource != this->resource)
		{
			*count--;
                         resource = R.resource;
                         count = R.count;
                         *count++;
		}
                return *this;
       }

        T* operator ->() const 
        {
                return resource;
        }

        T& operator * () const 
        {
                return *resource;
        }

        T* get () const 
        {
                return resource;
        }
};



class A
{
public:
	A()
	{
		cout << "created\n";
	}
	~A()
	{
		cout << "deleted\n";
	}
};

int main() 
{
	shr_ptr<A> sh1 = new A;
	shr_ptr<A> sh2 = new A;
	
	sh1 = sh2;
	
	return 0;
}