Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include <chrono>
- class Element
- {
- int val;
- public:
- Element(int valP) : val{ valP } { std::cout << "Element constructed for " << this << '\n'; };
- Element() : Element{ 0 } {};
- ~Element(){ std::cout << "Element destructed for " << this << '\n'; };
- int getVal() const { return val; };
- };
- template <typename T>
- class SmartPtr
- {
- T* ptr;
- public:
- SmartPtr(T* ptrP) : ptr{ ptrP } {}
- ~SmartPtr() { delete ptr; }
- SmartPtr(const SmartPtr& obj) = delete;
- SmartPtr& operator=(const SmartPtr& obj) = delete;
- SmartPtr(SmartPtr&& sPtr)
- : ptr{ sPtr.ptr }
- {
- sPtr.ptr = nullptr;
- }
- SmartPtr& operator=(SmartPtr&& sPtr)
- {
- if (!(&sPtr == this))
- {
- ptr = sPtr.ptr;
- sPtr.ptr = nullptr;
- }
- return *this;
- }
- T& operator*() { return *ptr; };
- const T& operator*()const { return *ptr; };
- T* operator->() { return ptr; };
- const T* operator->()const { return ptr; };
- void release() noexcept { delete ptr; };
- const T* get()const { return ptr; };
- };
- void foo()
- {
- //Element* ptr{ new Element{rand() % 10} };
- //SmartPtr<Element> sPtr{ ptr };
- SmartPtr<Element> sPtr{ new Element{rand() % 10} };
- std::cout << "Value is: " << sPtr->getVal() << '\n';
- //if (ptr->getVal() < 6) { throw std::runtime_error("Too small"); };
- if (sPtr->getVal() < 6) { throw std::runtime_error("Too small"); };
- // some work with ptr
- //delete ptr;
- }
- int main()
- {
- srand(time(nullptr));
- //for (int i{ 0 }; i < 5; ++i)
- //{
- // try
- // {
- // foo();
- // }
- // catch (std::exception ex)
- // {
- // std::cout << "Exception! => " << ex.what() << '\n';
- // }
- //
- //}
- SmartPtr<Element> sPtr{ new Element{rand() % 10} };
- std::cout << "Value is: " << sPtr->getVal() << '\n';
- std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
- auto sPtrOne{ std::move(sPtr) };
- std::cout << "sPtr == nullptr " << (sPtr.get() == nullptr) << '\n';
- std::cout << "sPtrOne == nullptr " << (sPtrOne.get() == nullptr) << '\n';
- std::cout << "Value is: " << sPtrOne->getVal() << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement