Simple auto_ptr



我写了自己的简单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("%dn", 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"中请求成员"打印",该成员的非类类型为"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)"类型?

语句

auto_ptr ptr(auto_ptr(data));

声明一个名为"ptr"的函数,该函数具有名为"data"的参数,类型为"auto_ptr",并返回类型为"auto_ptr"的值。

所以,不要犯这个错误)

相关内容

  • 没有找到相关文章

最新更新