我在C ++中有一个基本的多态性示例,具有以下结构。
struct Shape {
virtual void draw() = 0;
};
struct Circle : public Shape {
virtual void draw() {
cout << "drawing circle" << endl;
}
};
struct Triangle : public Shape {
virtual void draw() {
cout << "drawing triangle" << endl;
}
};
我有一个使用此设置的函数来调用draw函数:
void drawShapes(list<Shape*> shapes) {
list<Shape*>::iterator pShape = shapes.begin();
list<Shape*>::iterator pEnd = shapes.end();
for (; pShape != pEnd; pShape++) {
pShape->draw();
}
}
这正是我正在阅读的书中设置示例的方式。当我尝试编译时,我收到以下错误。
expression must have a pointer-to-class type
我通过将pShape->draw();
更改为(*pShape)->draw()
来解决此问题。
然后我将此作为可能的错误提交给本书的作者,他回复了
“事实并非如此,因为std :: list :: iterator有一个operator-&gt;()函数,它将迭代器解析为T *(在本例中为Shape *)。”
我仍然无法获得原始版本进行编译。我正在使用与VS2015捆绑在一起的编译器来进行这些测试。有谁知道为什么我会收到这个错误?
答案 0 :(得分:5)
你是对的,作者错了。 std::list<T>::iterator::operator*
返回T*
,这是真的。但在这种情况下,T
为Shape*
,即T* == Shape**
。您需要取消引用一次才能获得Shape*
。这就是pShape->draw()
失败的原因,但(*pShape)->draw()
有效。
答案 1 :(得分:1)
pShape->draw();
确实应该
(*pShape)->draw();