1 题目及要求
1.1 题目描述
实现智能指针。
2 解答
2.1 代码
#include <iostream>
#include <vector>
using namespace std;
template<typename T> class Pointer_m {
public:
Pointer_m(T *p = nullptr) :ptr(p), count(new size_t(1)) {}
Pointer_m(const Pointer_m& p) :ptr(p.ptr), count(p.count) {
++*count;
}
~Pointer_m() {
if (!--*count) {
delete ptr;
delete count;
ptr = nullptr;
}
}
Pointer_m& operator=(const Pointer_m& p) {
if (this != &p) {
if (!--*count) {
delete ptr;
delete count;
}
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}
T& operator*() const { return *ptr; }
T* operator->() const { return ptr; }
explicit operator bool() const { return !!ptr; }
T* get() const { return ptr; }
size_t use_count()const { return *count; }
bool unique() const { return *count == 1; }
friend Pointer_m make_pointer_m(const T&);
private:
T *ptr;
size_t *count;
};
template<typename T>
Pointer_m<T> make_pointer_m(const T& t) {
return Pointer_m<T> (new T(t));
}
int main() {
Pointer_m<vector<int>> p, q(make_pointer_m<vector<int>>({ 1,2,3 }));
p ? (cout << p.get()) : (cout << "NULL");cout << endl;
p = q;
p ? (cout << p.get()) : (cout << "NULL");cout << endl;
cout << p.use_count() << endl;
cout << p->back() << endl;
}