1
1
テーマ、知りたいこと
C++においてdynamic_castの多用は避けるべきなのか。
背景、状況
初めて質問させていただきます。
現在C++とDXTKでゲーム開発を行っております。
その中でインターフェースクラスとdynamic_castを多用する形になってしまいました。
そこでdynamic_castの多用について気になったので、ご意見をいただけると幸いです。
GameObjectという基底クラスを継承する形で、機能単位のクラスを実装し、
外部から必要とする振る舞いをインターフェースとして実装して、多重継承させる形で各クラスにもたせています。
以下、簡略化した例です。
C++
1// 基底クラス 2class GameObject 3{ 4 // 座標、回転、スケールなどの共通して使う情報 5} 6 7// シャドウマップへの描画を行うインターフェース 8struct IShadable 9{ 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の多用は避けるべきだと思いますか?
避けるべきとした時、より良くなる実装はどのような形が良くなると思われますか?
拙い文章ですが、ご教授いただけると幸いです。
よろしくお願いします。
回答6件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。