写了一个简单的int*的unique_ptr。 核心是 移动构造,移动拷贝 + 右值引用
头文件:
#define MY_UNIQUE_PTR
class my_unique_ptr { //单独的int型
private:
int* raw_ptr;
public:
my_unique_ptr(void* mem);
~my_unique_ptr();
my_unique_ptr(const my_unique_ptr& p) = delete; //采用delete 方法 或者声明到private里面,禁用传统拷贝构造和赋值运算符重载
my_unique_ptr& operator= (const my_unique_ptr& p) = delete;
my_unique_ptr(my_unique_ptr&& p); //移动构造
my_unique_ptr& operator= (my_unique_ptr&& p); //移动=重载
void show();
};
#endif
源文件:
#include "my_unique_ptr.h"
#include <iostream>
my_unique_ptr::my_unique_ptr(void* mem) {
raw_ptr =(int*) mem;
}
my_unique_ptr::~my_unique_ptr() {
if (raw_ptr != nullptr)
delete raw_ptr;
}
my_unique_ptr::my_unique_ptr(my_unique_ptr&& p) {
raw_ptr = p.raw_ptr;
p.raw_ptr = nullptr; //移动构造
}
my_unique_ptr& my_unique_ptr::operator= (my_unique_ptr&& p) {
raw_ptr = p.raw_ptr;
p.raw_ptr = nullptr; //移动拷贝
return *this;
}
void my_unique_ptr::show() {
if (raw_ptr == nullptr)
std::cout << "this unique_ptr is nullptr" << std::endl;
else
std::cout << "the val is: " << *raw_ptr << std::endl;
}