c++实现一个unique_ptr,声明和定义分开写
时间: 2024-05-03 15:22:47 浏览: 10
声明unique_ptr:
```
template<typename T>
class unique_ptr{
public:
unique_ptr() noexcept;
explicit unique_ptr(T* ptr) noexcept;
~unique_ptr() noexcept;
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
unique_ptr(unique_ptr&& other) noexcept;
unique_ptr& operator=(unique_ptr&& other) noexcept;
T* get() const noexcept;
T* release() noexcept;
void reset(T* ptr = nullptr) noexcept;
void swap(unique_ptr& other) noexcept;
T& operator*() const;
T* operator->() const noexcept;
explicit operator bool() const noexcept;
};
```
定义unique_ptr:
```
template<typename T>
unique_ptr<T>::unique_ptr() noexcept : ptr(nullptr) {}
template<typename T>
unique_ptr<T>::unique_ptr(T* ptr) noexcept : ptr(ptr) {}
template<typename T>
unique_ptr<T>::~unique_ptr() noexcept {
delete ptr;
}
template<typename T>
unique_ptr<T>::unique_ptr(unique_ptr&& other) noexcept : ptr(other.ptr) {
other.ptr = nullptr;
}
template<typename T>
unique_ptr<T>& unique_ptr<T>::operator=(unique_ptr&& other) noexcept {
if(this != &other) {
reset(other.ptr);
other.ptr = nullptr;
}
return *this;
}
template<typename T>
T* unique_ptr<T>::get() const noexcept {
return ptr;
}
template<typename T>
T* unique_ptr<T>::release() noexcept {
T* temp = ptr;
ptr = nullptr;
return temp;
}
template<typename T>
void unique_ptr<T>::reset(T* new_ptr) noexcept {
if(ptr != new_ptr) {
delete ptr;
ptr = new_ptr;
}
}
template<typename T>
void unique_ptr<T>::swap(unique_ptr& other) noexcept {
std::swap(ptr, other.ptr);
}
template<typename T>
T& unique_ptr<T>::operator*() const {
return *ptr;
}
template<typename T>
T* unique_ptr<T>::operator->() const noexcept {
return ptr;
}
template<typename T>
unique_ptr<T>::operator bool() const noexcept {
return ptr != nullptr;
}