1

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

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

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

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

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

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

我在编译时收到此错误:

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

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

4

3 回答 3

3

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

你可能想要:

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

尽管我必须推荐 Boost 的智能指针 ( scoped_ptrand shared_ptr) 或 C++11 的std::unique_ptrand std::shared_ptr.

于 2012-05-15T09:32:28.540 回答
2
auto_ptr<A> *a = (auto_ptr<A>*)new B();

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

auto_ptr<A> a(new B);
a->display();
于 2012-05-15T09:32:37.137 回答
2

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

于 2012-05-15T09:33:10.097 回答