8

これらはかなり大きなオブジェクトであるため、かなりのコードを省略します。私の質問は、実際にはstd::make_sharedの操作に関するものです。D3D11Shaderという名前空間SYNCにオブジェクトがあります。これには、と呼ばれる静的関数があります。

SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s)

これは文字列インデックスを取り、SYNC::D3D11Shaderから派生したシェーダーのインスタンスへのポインターを返します。ある時点で、スマートポインターを使用して、これらすべてのシェーダーを保持するベクター内でのこれらの割り当て解除を自動化し始めました。しかし、私がこれをするために行くとき、

 std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
 // ... verification of index and other initialization happens here
 // so i am unable to initialize it in it's constructor
 shaderPtr = std::make_shared<SYNC::D3D11Shader>(SYNC::D3D11Shader::CreateShader(shaderName));

抽象クラスであるこの行のD3D11Shaderのインスタンスをインスタンス化しようとしているというコンパイラエラー。make_sharedが行ったのは、std::shared_ptrのインスタンスを返すことだけだと思いました。CreateInstance関数は、このクラスのインスタンスを作成しようとはしません。それを派生させて実装するオブジェクトだけを作成します。この関数とスマートポインターを使用する前は、このエラーは発生していませんでした。誰かがここで何が起こっているのか知っていますか?

4

2 に答える 2

15

のコンストラクターを使用できない場合はshared_ptr、そのresetメンバー関数を使用して、新しいオブジェクトの所有権を付与します。

std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName));

make_shared<T>この状況に適していない理由はT、引数をコンストラクターに転送して、新しいを構築するためです。ただし、すでにオブジェクトを作成しているので、共有ポインタに所有権を与えたいだけです。

ただし、生のポインタを返さないことを強くお勧めしCreateShaderます。あなたは、CreateShaderそれをスマートポインターで包むか、それを呼び出すかを知るために、の呼び出し元に依存しdeleteています。unique_ptrクライアントに所有権を渡すために、直接戻ったほうがよいでしょうshared_ptr。そうすれば、彼らは必要に応じてそれを利用することができます。以下を参照してください。

std::unique_ptr<SYNC::D3D11Shader> uniquePtr(SYNC::D3D11Shader::CreateShader(shaderName));
// If you want a shared_ptr:
std::shared_ptr<SYNC::D3D11Shader> sharedPtr(std::move(uniquePtr));

または単に:

std::shared_ptr<SYNC::D3D11Shader> sharedPtr = SYNC::D3D11Shader::CreateShader(shaderName);

スマートポインタを使用する場合は、それらを使用してください。:)

于 2012-11-09T16:14:40.637 に答える
2

簡単:

shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName));

ここresetで、メンバー関数のさまざまなバリアントを確認できます。

于 2012-11-09T16:14:23.683 に答える