0

ISceneNode インターフェイスがあり、そこから SceneNode 基本クラスが作成されます。SceneNode クラスから、MeshNode、AnimNode、LightNode、CameraNode などを派生させます...

これで、メソッドを介して shared_ptr を受け取り、それをフィールドに格納するアクター クラスができました。

私ができるようにしたいのは、 std::shared_ptr またはその他の派生クラスを、 shared_ptr を受け取る関数に送信することです。

裸のポインターでは、これは暗黙の変換になります。

私が思いついた解決策は、各派生のオーバーロードを記述し、それを dynamic_pointer_cast を使用してメソッド内でキャストすることでした。それはただ厄介です。もっと良い方法があるはずです。

暗黙のキャストを取得する方法、またはこれを処理するための私が知らないより良い方法はありますか? これを処理する適切な方法は何ですか?

void SomeFunc()
{
    std::shared_ptr<MeshNode> pMeshNode( new MeshNode() );
    gActor.SetNode( pMeshNode );  // won't compile.

    // or do i have to do it like this
    gActor.SetNode( std::dynamic_pointer_cast<ISceneNode> (pMeshNode) );
}

void Actor::SetNode( std::shared_ptr<ISceneNode> pNode )
{
    mpNode = pNode;
}

// or do I have to do it like this?  Making an over load for each derived.
void Actor::SetNode( std::shared_ptr<MeshNode> pMeshNode )
{
    mpNode = std::dynamic_pointer_cast<ISceneNode> (pMeshNode);
}
4

2 に答える 2

4

あなたはそれがコンパイルされないと主張しますが、次のテストは私のためにコンパイルして実行します(VS2012、Clang、G ++)。発生しているエラーは別のものである可能性が高いため、投稿する必要があります。

#include <memory>

struct IBase {};

struct Derived : IBase {};

void Foo(std::shared_ptr<IBase> p) {}

int main()
{
    std::shared_ptr<Derived> d;
    Foo(d);
}
于 2012-11-14T21:34:14.577 に答える
2

VS2010を使用していると思いますか?そこでスマート ポインターのサポートに問題が見つかりましたか? より優れた C++11 サポート (VS2012、gcc、clang など) を備えたコンパイラでは、正常にコンパイルされるはずです。ただし、いくつかの拡張機能をお勧めします。

class Actor {
  std::shared_ptr<ISceneNode> mpNode;
public:
  void SetNode(std::shared_ptr<ISceneNode> pNode)
  { mpNode = std::move(pNode); }
};

void SomeFunc()
{
  gActor.SetNode(std::make_shared<MeshNode>());
}

1 つの動的割り当てを節約し、共有状態メモリのオーバーヘッドを最大で半分まで節約できる割り当て方を常にstd::shared_ptrお勧めします。std::make_shared<T>()また、関数への参照として渡すstd::shared_ptrか、少なくとも私が行ったように新しい値に移動する必要があります。std::unique_ptrさらに効果的 (共有状態メモリのオーバーヘッドやスレッド セーフな参照カウントがない) になり、設計が改善されます (明確な所有権) 。非常によく似た方法で使用できます。

class Actor {
  std::unique_ptr<ISceneNode> mpNode;
public:
  void SetNode(std::unique_ptr<ISceneNode> pNode)
  { mpNode = std::move(pNode); }
};

void SomeFunc()
{
  gActor.SetNode(std::unique_ptr<MeshNode>(new MeshNode));
}
于 2012-11-14T21:48:59.333 に答える