2012-11-09 21 views
5

Çok fazla kod atlayacağım çünkü bunlar oldukça büyük nesnelerdir ve benim sorum gerçekten sadece std :: make_shared'in çalışmasını ilgilendirir. SY3 adında D3D11Shader adlı bir nesnem var. Bu bir dize endeksi alıp SYNC türetilen bir shader :: D3D11Shader örneğine bir işaretçi döndürür adında bir statik fonksiyonunuhatası kullanarak std :: make_shared özet sınıf örneği

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

sahiptir. Bir noktada, tüm bu gölgelendiricileri tutan vektör içinde bunların ayrılmasını otomatikleştirmek için akıllı işaretçiler kullanmaya başladım. i bunu git Ancak,

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

derleyici hataları

i soyut sınıftır bu satırda D3D11Shader bir örneğini instanciate çalışıyorum söyleyerek. Tüm make_shared'in std :: shared_ptr örneğine döndüğünü sanmıştım. CreateInstance işlevi hiçbir zaman bu sınıfın bir örneğini oluşturmayı denemez, yalnızca onu oluşturan ve uygulayan nesneler. Bu işlevi ve akıllı işaretçileri kullanmadan önce bu hatayı almıyordum. Burada neler olduğunu bilen var mı? Yeterince

+2

make_shared http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared veya http://msdn.microsoft.com/en-us/library/ee410595.aspx –

+0

belgelerini inceleyin. Peki ateş, "Bir nesneyi oluşturur." sıfırlamadan sonra bir işaretçiye bir shared_ptr ayarlamak için zaten var mı? – FatalCatharsis

+0

Paylaşılan_ptr yapıcısını doğrudan 'shared_ptr ptr (your_pointer_here); 'veya ptr.reset (your_pointer_here); –

cevap

10

, onun reset member function ona yeni nesnenin sahipliğini vermek için kullanın: yeni bir T inşa nedeni, make_shared<T> bu durum için uygun değildir

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

olduğunu argümanlarını yapıcısına iletmek. Yine de bir nesneyi zaten oluşturmuştunuz, bu yüzden sadece paylaşılan işaretçinize sahip olmak istiyorsunuz.

Yine de bir ham işaretçiyi CreateShader'dan döndürmemenizi öneririz. Akıllı bir işaretçiye sarmak ya da üzerinde delete numaralı telefonu aramak için CreateShader numaralı aramaya güveniyorsunuz. Mülkün müşteriye iletilmesi için doğrudan unique_ptr döndüğünüzden daha iyi olursunuz ve isterlerse shared_ptr çıktısını alabilirler. Aşağıdaki bakınız: basitçe

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

Veya:

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

bunları kullanmak, akıllı işaretçileri kullanmak gidiyoruz. :)

+0

net ve özlü, teşekkürler bir demet! – FatalCatharsis

+0

@FatalCatharsis Tasarımınızı nasıl değiştirebileceğinize dair bazı yorumlar ekledim. –

+0

+1 Benim popomu kurtardım! –

2

Kolay:

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

Sen reset üye fonksiyonunun here farklı türevlerini görebilirsiniz. Eğer shared_ptr yapıcısı kullanamıyorsanız

İlgili konular