从std :: list <shape *> :: iterator的指针调用函数

时间:2016-07-19 01:55:44

标签: c++ c++11 iterator stdlist

我在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捆绑在一起的编译器来进行这些测试。有谁知道为什么我会收到这个错误?

2 个答案:

答案 0 :(得分:5)

你是对的,作者错了。 std::list<T>::iterator::operator*返回T*,这是真的。但在这种情况下,TShape*,即T* == Shape**。您需要取消引用一次才能获得Shape*。这就是pShape->draw()失败的原因,但(*pShape)->draw()有效。

答案 1 :(得分:1)

pShape->draw();

确实应该

(*pShape)->draw();