简单的auto_ptr

时间:2014-11-15 23:46:35

标签: c++ pointers smart-pointers

我编写了自己的简单auto_ptr类,但发现了一些魔法。

C ++标头文件

class A {
private:
    int data;
public:
    A(int data);
    void print() const;
};

class auto_ptr_ref;

class auto_ptr {
private:
    A* ptr = 0;
public:
    auto_ptr(A* p);
    auto_ptr(auto_ptr& p);
    auto_ptr(auto_ptr_ref p);
    ~auto_ptr();
    auto_ptr& operator =(auto_ptr& p);
    void release();
    operator auto_ptr_ref();
    A& operator*() const;
    A* operator->() const;
};

class auto_ptr_ref {
private:
    auto_ptr* ptr;
public:
    auto_ptr* get();
    auto_ptr_ref(auto_ptr* ptr);
};

C ++源文件

A::A(int data) : data(data) {}

void A::print() const {
    printf("%d\n", data);
}

auto_ptr::auto_ptr(A* p) : ptr(p) {}

auto_ptr::auto_ptr(auto_ptr& p) {
    ptr = p.ptr;
    p.release();
}

auto_ptr::auto_ptr(auto_ptr_ref p) {
    *this = *(p.get());
    p.get()->release();
}

auto_ptr::~auto_ptr() {
    delete ptr;
}

void auto_ptr::release() {
    ptr = NULL;
}

auto_ptr::operator auto_ptr_ref() {
    return auto_ptr_ref(this);
}

auto_ptr& auto_ptr::operator =(auto_ptr& p) {
    if (ptr != NULL)
        delete ptr;
    ptr = p.ptr;
    p.release();
    return *this;
}

A& auto_ptr::operator*() const {
    return (*ptr);
}

A* auto_ptr::operator->() const {
    return ptr;
}

auto_ptr_ref::auto_ptr_ref(auto_ptr* ptr) : ptr(ptr) {}

auto_ptr* auto_ptr_ref::get() {
    return ptr;
}

测试1

int main() {
    auto_ptr ptr(auto_ptr(new A(10)));
    ptr->print();
    return 0;
}

代码编译并打印10


测试2

int main() {
    A* data = new A(10);
    auto_ptr ptr(auto_ptr(data));
    ptr->print();
    return 0;
}

代码无法编译。

错误:请求'ptr'中的成员'print',这是非类型'auto_ptr(auto_ptr)'


测试3

int main() {
    A* data = new A(10);
    auto_ptr ptr((auto_ptr(data)));
    ptr->print();
    return 0;
}

此代码编译并打印10

请您解释第二个测试用例中会发生什么?为什么' ptr'有'auto_ptr(auto_ptr)'类型?

1 个答案:

答案 0 :(得分:0)

声明

auto_ptr ptr(auto_ptr(data));

声明一个名为' ptr'的函数。它有一个名为' data'的参数类型' auto_ptr'并返回类型' auto_ptr'。

的值

所以,不要犯这个错误)