#ifndef _TOYPTR_H_ #define _TOYPTR_H_ template class ToyPtr { public: // Constructor that accepts the ptr. ToyPtr(T *ptr) : ptr_(ptr) { } // NEW - Copy constructor. ToyPtr(const ToyPtr ©) { copyPtr(copy); } // Destructor that deletes the ptr. ~ToyPtr() { if (ptr_ != nullptr) { delete ptr_; ptr_ = nullptr; } } // NEW - Implement the "=" operator ToyPtr &operator=(const ToyPtr &rhs) { if (this != &rhs) copyPtr(rhs); return *this; } // Implement the "*" operator T &operator*() { return *ptr_; } // Implement the "->" operator T *operator->() { return ptr_; } private: // NEW - Helper function to copy from another ToyPtr. void copyPtr(const ToyPtr ©) { if (copy.ptr_ == nullptr) { if (ptr_ != nullptr) delete ptr_; ptr_ = nullptr; } else { if (ptr_ == nullptr) ptr_ = new T; *ptr_ = *copy.ptr_; } } // NEW - The pointer itself, default initialized to nullptr. T *ptr_ = nullptr; }; #endif // _TOYPTR_H_