私はゲームエンジンを再加工してsmart-pointers
を使用しています。私はすべてが継承するObject
クラスを持っています。私はIRenderable
(純粋な仮想レンダリング関数を定義するクラス)から継承し、はオブジェクトから継承しないようにレンダリング可能なGameObjectを持っています。私はRenderSystem
を持っていて、シーン内のすべてのIRenderableにshared_ptr
を保持するはずです。shared_ptrをある親クラスから別の親クラスにキャストするにはどうすればよいですか?
問題は私のGameObject shared_ptrをRenderSystemのIRenderableにキャストすることですか?私が試してみました
アイデア:
- RenderSystemは、ゲームオブジェクトのshared_ptrのを使用していますが、これは必ずしもすべてのゲームオブジェクトがレンダリング可能であるため、それが危険であるとして動作しません。
- IRenderableはObjectから継承しているので、それを継承することができます。これは、Objectが他の関数を含んでいるため、IRenderableはもはやインタフェースではないことを意味します。
これで完全に行う可能な生のポインタと、そのように、私は感じてスマートポインタと同じ結果を達成するためにいくつかの方法があるよう
例:このように
// Object.h
class Object : public enable_shared_from_this<Object> { ... }
// GameObject.h
class GameObject : public Object { ... }
// MeshRenderer.h
class MeshRenderer : public GameObject, IRenderable {
public:
void initialize()
{
// Not able to cast Object to IRenderable
RenderSystem::instance().addRenderable(getShared());
// AND
// Not able to cast Object to IRenderable
RenderSystem::instance().addRenderable(std::static_pointer_cast<IRenderable>(getShared()));
}
}
// RenderSystem.h
class RenderSystem
{
std::list<std::shared_ptr<IRenderable>> m_renderables;
public:
void addRenderable(std::shared_ptr<IRenderable> ptr)
{
m_renderables.push_back(ptr);
}
}
// main.cpp
...
auto meshRenderer = std::shared_ptr<MeshRenderer>();
...
おそらくhttps://stackoverflow.com/q/20219385/103167の複製ですか? 'std :: dynamic_pointer_cast'が問題を解決しないかどうかを見てください。 –
私は今それを試みます。 – Matthew
shared_ptrは重く、遅いことに注意してください。実際のアプリケーションでは、パフォーマンスは重要ではない場所で使用されます。 –