テーマ、知りたいこと
C++においてdynamic_castの多用は避けるべきなのか。
背景、状況
初めて質問させていただきます。
現在C++とDXTKでゲーム開発を行っております。
その中でインターフェースクラスとdynamic_castを多用する形になってしまいました。
そこでdynamic_castの多用について気になったので、ご意見をいただけると幸いです。
GameObjectという基底クラスを継承する形で、機能単位のクラスを実装し、
外部から必要とする振る舞いをインターフェースとして実装して、多重継承させる形で各クラスにもたせています。
以下、簡略化した例です。
C++
1// 基底クラス2class GameObject 3{4 // 座標、回転、スケールなどの共通して使う情報5}6 7// シャドウマップへの描画を行うインターフェース8struct IShadable9{10 virtual ~IShadable();11 virtual void RenderShadowMap() = 0; // シャドウマップに描画を行う関数12}13 14// モデルを描画するオブジェクト15class ModelObject : public GameObject, public IShadable 16{17 ...18 // シャドウマップに描画を行う関数19 void RenderShadowMap() override;20}
そしてこのオブジェクトたちをGameObjectのポインタ配列として保持させています。
描画を行う際などは、配列内の要素をdynamic_castを使用してインターフェースを実装しているなら処理を行うようにしていました。
以下、例です。
C++
1// シーンクラス内2std::vector<std::unique_ptr<GameObject>> m_gameObjects;3 4// モデルオブジェクトを追加5m_gameObjects.push_back(std::make_unique<ModelObject>(...));6 7 8// シャドウマップに描画を行う9for(const GameObject& obj : m_gameObjects)10{11 IShadable* shadable = dynamic_cast<IShadable*>(obj.get());12 if(shadable)13 {14 shadable->RenderShadowMap();15 }16}
この設計だと、どうしてもインターフェースにアクセスするためにはdynamic_castを使用する事になってしまいます。
そこで、そもそもの話としてdynamic_castの多用は避けるべきだと思いますか?
避けるべきとした時、より良くなる実装はどのような形が良くなると思われますか?
拙い文章ですが、ご教授いただけると幸いです。
よろしくお願いします。

0 コメント