मैंने एक स्थैतिक फैक्ट्री विधि लिखी है जो एक अन्य डेटा ऑब्जेक्ट से पॉप्युलेट की गई एक नई Foobar ऑब्जेक्ट देता है। मैंने हाल ही में स्वामित्व अर्थशास्त्र के साथ भ्रमित किया है और मुझे आश्चर्य है कि क्या मैं इस फैक्टरी विधि को unique_ptr
लौटाकर सही संदेश भेज रहा हूं।स्वामित्व semantics जैसे कच्चे सूचक के लिए unique_ptr वापस करने के लिए बुरा अभ्यास?
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
मेरा इरादा ग्राहक कोड को बताना है कि वे सूचक हैं। एक स्मार्ट सूचक के बिना, मैं बस Foobar*
वापस आऊंगा। हालांकि, मैं यह लागू करना चाहता हूं कि संभावित बग से बचने के लिए यह स्मृति हटा दी जाए, इसलिए unique_ptr
उचित समाधान की तरह लग रहा था। यदि ग्राहक पॉइंटर के जीवनकाल को विस्तारित करना चाहता है, तो वे प्राप्त करने के बाद बस .release()
पर कॉल करें।
Foobar* myFoo = Foobar::factory(data).release();
मेरा प्रश्न दो भागों में आता है:
- इस दृष्टिकोण सही स्वामित्व अर्थ विज्ञान व्यक्त करता है?
- क्या यह कच्चे सूचक के बजाय
unique_ptr
वापस करने के लिए "खराब अभ्यास" है?
आप एक unqiue_ptr ग्राहक बताने के लिए वे सूचक ही वापस लौट रहे हैं: तो मैं कुछ इस तरह करना होगा? यह वही विपरीत है जो मैं अपेक्षा करता हूं (क्योंकि उन्हें स्पष्ट रूप से अद्वितीय सूचक का स्वामित्व लेना होगा)। – jknupp
इसके बजाय आप move-semantics का उपयोग करना चाहेंगे (यदि आप C++ 11 का उपयोग करने में सक्षम हैं)। इसके साथ, यह तय करने के लिए उपयोगकर्ता पर निर्भर करता है कि फैक्ट्री द्वारा बनाई गई वस्तु के जीवनकाल को कैसे बढ़ाया जाए। – evnu
@evnu ऐसा कुछ है जो आपके लिए स्वचालित रूप से किया जाता है, नहीं? –