不确定某人是否已经问过这个,但我在这里看到了一个奇怪的行为:
我已经声明了两个类,一个基类,一个仅使用一个虚方法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'的成员”
我做错了吗?有人可以解释一下这种行为吗?
答案 0 :(得分:3)
您正在创建指向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
。
答案 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它的工作原理。