C++ 简单自动检查

C++ 简单自动检查,c++,pointers,smart-pointers,C++,Pointers,Smart Pointers,我自己编写了一个简单的auto_ptr类,但发现了一些魔力 C++头文件 C++源文件 测试1 代码编译并打印10 测试2 代码无法编译 错误:“ptr”中的成员“print”请求,该成员属于非类类型“auto_ptrauto_ptr” 测试3 这段代码编译并打印10个 你能解释一下在第二个测试用例中发生了什么吗?为什么“ptr”有“auto\u ptrauto\u ptr”类型?该语句 auto_ptr ptr(auto_ptr(data)); 声明一个名为“ptr”的函数,该函数的参数名为

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

C++头文件

C++源文件

测试1

代码编译并打印10

测试2

代码无法编译

错误:“ptr”中的成员“print”请求,该成员属于非类类型“auto_ptrauto_ptr”

测试3

这段代码编译并打印10个

你能解释一下在第二个测试用例中发生了什么吗?为什么“ptr”有“auto\u ptrauto\u ptr”类型?

该语句

auto_ptr ptr(auto_ptr(data));
声明一个名为“ptr”的函数,该函数的参数名为“data”,类型为“auto_ptr”,并返回类型为“auto_ptr”的值


所以,不要犯这个错误

你为什么要编写自己的auto\ptr?C++不喜欢它是一种危险的、不直观的设计妥协,当它能指定更好的UpQuyPtR.Tobe因为它是我的家庭任务。
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;
}
int main() {
    auto_ptr ptr(auto_ptr(new A(10)));
    ptr->print();
    return 0;
}
int main() {
    A* data = new A(10);
    auto_ptr ptr(auto_ptr(data));
    ptr->print();
    return 0;
}
int main() {
    A* data = new A(10);
    auto_ptr ptr((auto_ptr(data)));
    ptr->print();
    return 0;
}
auto_ptr ptr(auto_ptr(data));