class Shape {
public:
virtual ~Shape(){}
virtual void draw() = 0;
};
class Line: public Shape;
class Surface: public Shape;
...
// 生成されたオブジェクトを保持
std::vector<Shape*> objectList;
実行時の型を知る必要があります。そこでtypeidやdynamic_castを使えば良いと思うのですが
google c++スタイルガイドによるとRTTIを使うような場合には設計上の欠陥があると書かれています。
そこで、Visitorパターンを用いることにしたのですが、これにも欠点があり、それを解消したものに
Acyclic Visitorというのがあると知りました。しかし、そのコードには
class Surface{
public:
void accept(IVisitor* v) {
if (SurfaceVisitor* ev = dynamic_cast<SurfaceVisitor*>(v))
v->visit(*this);
else
// Accept Error
}
}
元々、実行時型情報を用いるのが良くないとのことですが、それを解決するためにdynamic_castを用いるのは問題ないのでしょうか?それなら始めから
void update() {
Shape* p = GetSelectedObject();
if (Surface* sp = dynamic_cast<Surface*>(p)) {
// Surfaceに対する処理
}
}
そもそも、なぜ実行時型情報を用いることが設計が悪いことになるのかあまりわかっていないのですが、
直接dynamic_castを使うのと、VisitorもしくはAcyclic Visitorを使うのとは何が違うのでしょうか?