#pragma once template<typename TR> class joker_shared_ptr { private: TR * ptr; size_t * count; public: constexpr joker_shared_ptr(/* args */)noexcept{ } constexpr joker_shared_ptr(std::nullptr_t )noexcept { } explicit joker_shared_ptr(TR * ptr):ptr(ptr),count(new size_t(1)){ } ~joker_shared_ptr() { if(count != nullptr && (*count) > 1) { (*count) -- ; return; } if(count != nullptr ) delete count; if(ptr != nullptr ) delete ptr; } joker_shared_ptr(const joker_shared_ptr &other)noexcept:ptr(other.ptr),count(other.count) { if(count != nullptr) { (*count)++; } } joker_shared_ptr& operator=(const joker_shared_ptr & other)noexcept { if (this->get() == other.get()) { return *this; } if(count != nullptr) { (*count)--; if(*count == 0) { delete count; if(ptr != nullptr) delete ptr; } } count = other.count; ptr = other.ptr; if(count != nullptr && ptr != nullptr) { (*count)++; } return *this; } size_t use_count() const noexcept { if( count != nullptr) { return *count; } else { return 0; } } TR* get()const noexcept { return ptr; } TR& operator*() const noexcept { return *ptr; } }; #if 0 template<typename TR> joker_shared_ptr<TR>& joker_shared_ptr<TR>::operator=(const joker_shared_ptr & other)noexcept { if(count != nullptr) { (*count)--; if(*count == 0) { delete count; if(ptr != nullptr) delete ptr; } } count = other.count; ptr = other.ptr; if(count != nullptr && ptr != nullptr) { (*count)++; } return *this; } #endif
标签:count,nullptr,C++,joker,智能,other,shared,ptr,指针 From: https://www.cnblogs.com/JOKER2255/p/18311594