不确定是否有人已经问过这个问题,但我在这里看到了一种奇怪的行为:
我已经声明了两个类,一个是基类,一个是仅用一个虚拟方法派生的类display()
。
class A {
public:
virtual void display() {
cout << "base class" << endl;
}
};
class B:public A {
public:
void display() {
cout << "derived class" << endl;
}
};
现在,在main()
中,如果我尝试声明A
的auto_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_ptr
和 shared_ptr
)或 C++11 的std::unique_ptr
和std::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);
.在这里阅读它是如何工作的。