2012-11-09 23 views
5

का उपयोग कर त्रुटि मैं काफी कोड छोड़ने जा रहा हूं क्योंकि ये कुछ बड़ी वस्तुएं हैं, और मेरा प्रश्न वास्तव में std :: make_shared के संचालन से संबंधित है। मेरे पास नेमस्पेस सिंक में एक ऑब्जेक्ट है जिसे D3D11Shader कहा जाता है। यह एक स्थिर समारोह कहा जाता है,std :: make_shared अमूर्त वर्ग तात्कालिकता

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

जो एक स्ट्रिंग सूचकांक लेने के लिए और समन्वयन से ली गई है कि एक शेडर :: 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 का एक उदाहरण instanciate कोशिश कर रहा हूँ जब मैं यह करने के लिए, जाओ। मैंने सोचा कि सभी 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

के दस्तावेज़ों की जांच करें खैर शूट, परिभाषा में महत्वपूर्ण वाक्यांश, "एक वस्तु का निर्माण।" क्या शुरुआतीकरण के बाद किसी पॉइंटर पर साझा_ptr को सेट करने के लिए वैसे भी है? – FatalCatharsis

+0

साझा_प्टर के कन्स्ट्रक्टर का उपयोग सीधे 'shared_ptr ptr (your_pointer_here); ', या' ptr.reset (your_pointer_here);' यदि आपके पास मौजूदा है। –

उत्तर

10

आप shared_ptr के निर्माता का उपयोग नहीं कर सकते हैं, इसके reset member function यह एक नई वस्तु का स्वामित्व देने के लिए उपयोग करें:

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

आप स्मार्ट संकेत का उपयोग करने, उन्हें इस्तेमाल जा रहे हैं। :)

+0

स्पष्ट और संक्षेप में, एक गुच्छा धन्यवाद! – FatalCatharsis

+0

@ फाताल कैथर्सिस मैंने कुछ टिप्पणियां जोड़े कि आप अपना डिज़ाइन कैसे बदल सकते हैं। –

+0

+1 मेरे बट को बचाया! –

2

काफी आसान:

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

आप reset सदस्य समारोह here के अलग-अलग रूपों देख सकते हैं।

संबंधित मुद्दे