2016-07-19 4 views
1

私は基本的な多態性の例をC++で次のような構造にしました。std :: listからポインタ上の関数を呼び出す<Shape*> :: iterator

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; 
    } 
}; 

私は、次のような描画機能を呼び出すために、この設定を使用した機能を持っている:

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 ::リスト::イテレータ演算子を持っているので、実際には、そうではないのですイテレータをT *(この場合はShape *)に解決する関数です。

私はまだ元のバージョンをコンパイルすることはできません。これらのテストを行うには、VS2015にバンドルされているコンパイラを使用しています。なぜ誰かがこのエラーを受けているのか知っていますか?

+1

恐ろしい反応です。私は本が何であるか尋ねてもいいですか? – songyuanyao

+0

もちろん、誰もが間違いを犯します。しかし、少なくとも応答する前に試してみるべきです。 – songyuanyao

+0

pShapeはイテレータなので、イテレータのderef'ingは元のT値を生成します。この場合、Shape *はderef'dでなければなりません。 – Casey

答えて

5

でなければなりません。 std::list<T>::iterator::operator*T*を返します。これは該当します。しかし、この場合、TShape*であり、T* == Shape**となります。あなたはShape*を得るためにそれを逆参照する必要があります。そのため、pShape->draw()は失敗しますが、(*pShape)->draw()が機能します。

1
pShape->draw(); 

は確かにあなたが正しいなら、と著者は間違っている

(*pShape)->draw(); 
関連する問題