#pragma once template class ptr { T* pointer; unsigned int* counter; public: ptr(); ptr(T* pointer); ptr(const ptr& copy); ~ptr(); ptr& operator=(const ptr& copy); operator T*(); T* operator->(); }; template ptr::ptr() { pointer = nullptr; counter = nullptr; } template ptr::ptr(T* pointer) { this->pointer = pointer; counter = new unsigned int(); *counter = 1; } template ptr::ptr(const ptr& copy) { pointer = copy.pointer; counter = copy.counter; if (counter != nullptr) { (*counter)++; } } template ptr::~ptr() { if (counter != nullptr) { (*counter)--; if (*counter == 0) { delete pointer; delete counter; } } } template ptr& ptr::operator=(const ptr& copy) { if (counter != nullptr) { (*counter)--; if (*counter == 0) { delete pointer; delete counter; } } pointer = copy.pointer; counter = copy.counter; if (counter != nullptr) { (*counter)++; } return *this; } template ptr::operator T*() { return pointer; } template T* ptr::operator->() { return pointer; }