#pragma once /* int *p = new int(9); SharedPtr<int> px(p); //ok SharedPtr<int> py(new int(9)); //good SharedPtr<int> pz = px; //good SharedPtr<int> pw(p); //Error, NO!! because of px. */ template<class T> class SharedPtr { public: //Constructor // explicit SharedPtr(T* p = NULL) : m_ptr(p), m_count(new long(1)) { } SharedPtr(const SharedPtr<T>& p) : m_ptr(p.m_ptr), m_count(p.m_count) { _AddRef(); } SharedPtr<T>& operator=(const SharedPtr<T>& p) { if (*this != p) { _Release(); m_ptr = p.m_ptr; m_count = p.m_count; _AddRef(); } return *this; }; //operator // T& operator*() const { return *m_ptr; } T* operator->() const { return m_ptr; } operator bool() const { return (m_ptr != 0); } bool operator ==(const SharedPtr<T>& p) const { return m_ptr == p.m_ptr; } bool operator !=(const SharedPtr<T>& p) const { return m_ptr != p.m_ptr; } //Get pointer // T* GetInternalPtr() { return m_ptr; } //Deconstructor // ~SharedPtr() { _Release(); } public: //Add reference // long _AddRef() { return m_count ? ++(*m_count) : 0; } //Release the object // long _Release() { if (m_count == NULL) return 0; long nRef = --(*m_count); if (nRef == 0) { delete m_ptr; delete m_count; m_ptr = 0; m_count = 0; } return nRef; } private: //Data // T* m_ptr; //shared ptr long* m_count;//ptr count };