智能指针 (auto_ptr) 行为



不确定是否有人已经问过这个问题,但我在这里看到了一种奇怪的行为:

我已经声明了两个类,一个是基类,一个是仅用一个虚拟方法派生的类display()

class A {
public:
    virtual void display() {
        cout << "base class" << endl;
    }
};
class B:public A {
public:
    void display() {
        cout << "derived class" << endl;
    }
};

现在,在main()中,如果我尝试声明Aauto_ptr并为其分配一个新的B实例,

int main() {
    auto_ptr<A> *a = (auto_ptr<A>*)new B();
    a->display();
}

我在编译时收到此错误:

" 'class std::auto_ptr<A>'没有名为'display'的成员"

我做错了什么吗?有人可以解释这种行为吗?

您正在创建指向auto_ptr的指针。auto_ptr是一个类似于指针工作的对象,因此您无需添加*

您可能希望:

auto_ptr<A> a(new B());
a->display();

尽管我必须重新评论 Boost 的智能指针(scoped_ptrshared_ptr)或 C++11 的std::unique_ptrstd::shared_ptr

auto_ptr<A> *a = (auto_ptr<A>*)new B();

这是在做一件非常奇怪的事情。如果要创建一个对象并使用智能指针来管理它,请使用指向该对象的指针初始化智能指针:

auto_ptr<A> a(new B);
a->display();

你为什么写auto_ptr<A> *a?不应该是那样的。因此,您会收到此错误。应该是auto_ptr<A> a(new B);.在这里阅读它是如何工作的。

相关内容

  • 没有找到相关文章

最新更新