2

少し前に使った Visitor パターンを修正しています。仮想メソッドaccept(Visitor)を持つ基本クラスElementがあり、このメソッドはElementから継承するすべてのクラスでオーバーライドされます。また、任意の派生クラスで accept() が行うことは、visitor->visit(*this) を呼び出すことだけです。クライアントがコードを実行すると、たとえば次のようになります。

Visitor& theVisitor = *new ConcreteVisitor();    
for_each(elements.begin(), elements.end(), [](Element& e) { e.accept(theVisitor));})

クライアントが次のように Visitor->visit(element) を呼び出すことができない理由:

Visitor& theVisitor = *new ConcreteVisitor();    
for_each(elements.begin(), elements.end(), [&theVisitor](Element& e) { theVisitor.visit(e); });

element.accept(visitor) を呼び出して、それが次に visitor.visit(element) を呼び出す場合に役立つ情報は何ですか? これにより、Visitor パターンの使用が煩雑になり、Element クラスのすべての階層で追加のコードが必要になります。

では、誰かがここで accept() の利点を説明できますか?

4

1 に答える 1