#ifndef SMARTPTR_H #define SMARTPTR_H #include template class member_ptr { public: explicit member_ptr(T *p = 0) : m_p(p) {} ~member_ptr(); const T& operator*() const { return *m_p; } T& operator*() { return *m_p; } const T* operator->() const { return m_p; } T* operator->() { return m_p; } const T* get() const { return m_p; } T* get() { return m_p; } T* release() { T *old_p = m_p; m_p = 0; return old_p; } void reset(T *p = 0); private: member_ptr(const member_ptr& rhs); // copy not allowed void operator=(const member_ptr& rhs); // assignment not allowed T *m_p; }; template member_ptr::~member_ptr() {delete m_p;} template void member_ptr::reset(T *p) {delete m_p; m_p = p;} // ******************************************************** template class counted_ptr { public: explicit counted_ptr(T *p = 0); counted_ptr(const counted_ptr& rhs); ~counted_ptr(); const T& operator*() const { return *m_p; } T& operator*() { return *m_p; } const T* operator->() const { return m_p; } T* operator->() { return m_p; } const T* get() const { return m_p; } T* get() { return m_p; } counted_ptr & operator=(const counted_ptr& rhs); private: T *m_p; }; template counted_ptr::counted_ptr(T *p) : m_p(p) { if (m_p) m_p->m_referenceCount = 1; } template counted_ptr::counted_ptr(const counted_ptr& rhs) : m_p(rhs.m_p) { if (m_p) m_p->m_referenceCount++; } template counted_ptr::~counted_ptr() { if (m_p && --m_p->m_referenceCount == 0) delete m_p; } template counted_ptr & counted_ptr::operator=(const counted_ptr& rhs) { if (m_p && --m_p->m_referenceCount == 0) delete m_p; m_p = rhs.m_p; if (m_p) m_p->m_referenceCount++; return *this; } // ******************************************************** template class vector_member_ptrs { public: vector_member_ptrs(unsigned int size=0) : _size(size) {ptr = new member_ptr[_size];} ~vector_member_ptrs() {delete [] ptr;} member_ptr& operator[](unsigned int index) {assert(index<_size); return ptr[index];} const member_ptr& operator[](unsigned int index) const {assert(index<_size); return ptr[index];} unsigned int size() const {return _size;} void resize(unsigned int newSize) { member_ptr *newPtr = new member_ptr[newSize]; for (unsigned int i=0; i &c); // copy not allowed void operator=(const vector_member_ptrs &x); // assignment not allowed unsigned int _size; member_ptr *ptr; }; #endif