2012-11-09 61 views
5

これらはかなり大きなオブジェクトであり、私の質問は実際にはstd :: make_sharedの操作に関係しているので、かなりのコードを省略します。私はD3D11Shaderと呼ばれる名前空間SYNCにオブジェクトを持っています。これは、と呼ばれる静的機能を持っているstd :: make_shared抽象クラスのインスタンス化を使用したエラー

文字列インデックスを取り、SYNC :: D3D11Shaderから導出されたシェーダのインスタンスへのポインタを返します
SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s) 

。ある時点で、私はスマートポインタを使って、これらのシェーダをすべて保持していたベクトル内でこれらの割り付け解除を自動化し始めました。私はこれを行うに行くときしかし、

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関数は、このクラスのインスタンスを作成しようとせず、それを派生して実装するオブジェクトだけを作成しようとします。私はこの関数とスマートポインタを使用する前にこのエラーが発生していませんでした。誰がここで何が起こっているのか知っていますか?

+2

make_shared http://en.cppreference.com/w/cpp/memory/shared_ptr/make_sharedまたはhttp://msdn.microsoft.com/en-us/library/ee410595.aspxのドキュメントを確認してください。 –

+0

よく撃つ、定義のキーフレーズは、 "オブジェクトを構築する。とにかく初期化の後にshared_ptrをポインタに設定するだけですか? – FatalCatharsis

+0

既存のshared_ptrのコンストラクタを 'shared_ptr ptr(your_pointer_here);'または 'ptr.reset(your_pointer_here);に直接使用してください。 –

答えて

10

あなたはそれを新しいオブジェクトの所有権を与えるために、そのreset member functionを使用し、shared_ptrのコンストラクタを使用できない場合:それは新しいTを構築するためmake_shared<T>は、このような状況には適していません

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

理由があります引数をそのコンストラクタに転送します。しかし、既にオブジェクトを構築しているので、共有ポインタに所有権を与えたいだけです。

CreateShaderから生ポインタを返さないことを強くお勧めします。あなたはCreateShaderの発信者に頼ってスマートなポインタにまとめたり、deleteに電話してください。クライアントに所有権を渡すためにunique_ptrを直接返す方が良いでしょうし、好きなだけshared_ptrを作成することができます。あなたがそれらを使用して、スマートポインタを使用するつもりなら

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

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)); 

それとも単に次を参照してください。 :)

+0

明確で簡潔な、おかげで束! – FatalCatharsis

+0

@FatalCatharsisデザインをどのように変更できるかについてのコメントを追加しました。 –

+0

+1私のお尻を保存! –

2

十分に簡単:

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

あなたはresetメンバ関数hereの異なるバリエーションを見ることができます。

関連する問題