智能指针(auto_ptr)行为

时间:2012-05-15 09:28:53

标签: c++ smart-pointers 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()中,如果我尝试声明auto_ptr A并为其分配B的新实例,

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

编译时出现此错误:

  

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

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

3 个答案:

答案 0 :(得分:3)

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

你可能想要:

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

虽然我必须推荐Boost的智能指针(scoped_ptrshared_ptr)或C ++ 11的std::unique_ptrstd::shared_ptr

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

你为什么写auto_ptr<A> *a?它应该不是那样的。因此,您收到此错误。它应该是auto_ptr<A> a(new B);。阅读here它的工作原理。