Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. #ifndef SMARTPOINTER_H
  2. #define SMARTPOINTER_H
  3. template <class T>
  4. class SmartPointer
  5. {
  6. T* m_pointer;
  7. int* m_referenceCounter;
  8. public:
  9. SmartPointer();
  10. ~SmartPointer();
  11. // the referenceCounter is increased by the copyconstructor
  12. SmartPointer(const SmartPointer<T>& smartPointer);
  13. // the referenceCounter is increased also increased by the = operator
  14. SmartPointer<T>& operator=(const SmartPointer<T>& smartPointer);
  15. T& operator*() const;
  16. T* operator->() const;
  17. // we need to overload -> and *
  18.  
  19. };
  20.  
  21. // for templates we do everything in one file
  22. template <class T>
  23. SmartPointer<T>::SmartPointer()
  24. {
  25. this->m_referenceCounter = new int();
  26. *(this->m_referenceCounter) = 1; // why 1?
  27. this->m_pointer = new T();
  28. }
  29.  
  30. template <class T>
  31. SmartPointer<T>::~SmartPointer()
  32. {
  33. if (m_referenceCounter == 0)
  34. {
  35. delete this->m_referenceCounter;
  36. delete this->m_pointer;
  37. this->m_referenceCounter == NULL;
  38. this->m_pointer == NULL;
  39. }
  40. }
  41.  
  42. template <class T>
  43. SmartPointer<T>::SmartPointer(const SmartPointer<T>& smartPointer)
  44. {
  45. // increment the referenceCounter
  46. smartPointer.m_referenceCounter++;
  47. this->m_referenceCounter = smartPointer.m_referenceCounter;
  48. this->m_pointer = smartPointer.m_pointer;
  49. }
  50.  
  51. template <class T>
  52. SmartPointer<T>& SmartPointer<T>::operator=(const SmartPointer<T>& smartPointer)
  53. {
  54. // increment the referenceCounter
  55. smartPointer.m_referenceCounter++;
  56. this->m_referenceCounter = smartPointer.m_referenceCounter;
  57. this->m_pointer = smartPointer.m_pointer;
  58. }
  59.  
  60. template <class T>
  61. T& SmartPointer<T>::operator*() const
  62. {
  63. return (*m_pointer);
  64. }
  65.  
  66. template <class T>
  67. T* SmartPointer<T>::operator->() const
  68. {
  69. return (m_pointer);
  70. }
  71.  
  72.  
  73.  
  74. #endif // SMARTPOINTER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement