2015-04-07 16 views
13

मैं स्मार्ट पॉइंटर्स का उपयोग कर क्लास सदस्य चर के लिए एक एक्सेसर बनाने का प्रयास कर रहा हूं।सदस्य चर के लिए एक स्मार्ट सूचक वापस कैसे करें?

class MyResource 
{ 
}; 

class MyClass 
{ 
public: 
    std::unique_ptr<MyResource> getResource(); 
private: 
    std::unique_ptr<MyResource> resource; 
}; 

std::unique_ptr<MyResource> MyClass::getResource() 
{ 
    return this->resource; 
} 

त्रुटि मैं इस संकलन की कोशिश कर रहा हो: '< unique_ptr std :: _Ty>'

उपयोग नहीं कर सकते निजी सदस्य कक्षा में घोषित

.get जोड़ना कोड यह निश्चित रूप से this->resource काम नहीं करता है क्योंकि रिटर्न प्रकार बदलता है।

क्या मुझे यहां एक unique_ptr का उपयोग नहीं करना चाहिए? क्या यह सिर्फ एक वाक्यविन्यास मुद्दा है? क्या मैं पूरी तरह गलत ट्रैक पर हूं?

स्मार्ट संकेत के साथ मेरी पृष्ठभूमि: मैं कुछ साल के लिए सादे पुराने संकेत का उपयोग कर रहे हैं भाग में, क्योंकि मैं जब स्मार्ट संकेत की जो प्रकार का उपयोग करने का एक ठोस स्पष्टीकरण नहीं मिल रहा है और उनका उपयोग करने के बारे में कैसे जाना है। मैं बहाने करने से थक गया हूं, इसलिए मैं सिर्फ डाइविंग कर रहा हूं। मुझे लगता है कि मैं समझता हूं कि स्मार्ट पॉइंटर्स क्या हैं और उनका उपयोग क्यों करें, लेकिन मैं विवरणों का बहुत कम समझता हूं। फिलहाल मैं theendlessQ&Aaboutsmartpointers में पूरी तरह खो गया हूं।

+5

आपको यहां एक अद्वितीय सूचक का उपयोग नहीं करना चाहिए। इसे मूल्य से वापस करें या इसे साझा सूचक बनाएं। – dwcanillas

+3

@ ड्वाकनिलस या संदर्भ या कच्चे सूचक द्वारा इसे वापस करें। – Angew

+2

@ एंज्यू हाँ, बिल्कुल। अद्वितीय पॉइंटर्स का पूरा बिंदु यह है कि वे अद्वितीय हैं, एक वस्तु के लिए एक सूचक है। – dwcanillas

उत्तर

23

स्मार्ट पॉइंटर्स के बारे में समझने की सबसे महत्वपूर्ण बात यह है कि "पॉइंटर" पहलू उनके अर्थशास्त्र का मौलिक हिस्सा नहीं है। स्वामित्व का प्रतिनिधित्व करने के लिए स्मार्ट पॉइंटर्स मौजूद हैं। स्वामित्व को सफाई के लिए जिम्मेदारी के रूप में परिभाषित किया गया है।

एक अद्वितीय सूचक कहता है: "मैं पॉइंट के एकमात्र मालिक हूं। जब मैं गुंजाइश से बाहर निकलता हूं तो मैं इसे नष्ट कर दूंगा।"

एक साझा सूचक कहते हैं: "मैं उन मित्रों के समूह में से एक हूं जो पॉइंट के लिए ज़िम्मेदारी साझा करते हैं। हममें से आखिरी बार गुंजाइश से बाहर निकलने के लिए इसे नष्ट कर दिया जाएगा।"

(एक आधुनिक सी ++ प्रोग्राम में) एक कच्चा सूचक या संदर्भ कहता है: "मेरे पास पॉइंट नहीं है, मैं इसे केवल देखता हूं। कोई और इसे नष्ट करने के लिए ज़िम्मेदार है।"

आपके मामले में, सदस्य प्रकार के लिए unique_ptr का उपयोग करना मतलब है कि MyClassMyResource ऑब्जेक्ट का मालिक है।अगर गेटर को स्वामित्व स्थानांतरित करना होता है (यानी, MyClass जो भी गेटर कहलाता है, को संसाधन छोड़ रहा है), unique_ptr लौटाना उचित है (और स्वामित्व हस्तांतरण को स्पष्ट करने के लिए आपको return std::move(resource); करना होगा)।

गेटर है अगर लौटने स्वामित्व (जो मैं संभावना परिदृश्य पर विचार करें), बस एक सादे पुराने सूचक वापसी (यदि एक अशक्त सूचक लौटने एक विकल्प है) या एक सादे पुराने संदर्भ देने के लिए नहीं होना चाहिए (शून्य एक विकल्प नहीं है)।

+0

जबकि दूसरे उत्तर को और वोट मिले हैं, स्पष्टीकरण के कारण यह जवाब व्यक्तिगत रूप से मेरे लिए सबसे उपयोगी था। अब मुझे लगता है (मैं आशा करता हूं) कि मैं अंततः इसे समझता हूं। –

+0

@ डेविड, यही कारण है कि एसओ में वोटिंग और स्वीकार करने की दोनों अवधारणाएं हैं :-) मदद करने में खुशी हुई। – Angew

+3

तीसरे मामले के लिए, जल्द ही हमारे पास 'std :: experimental :: observer_ptr' भी होगा। –

17

आपके पास कक्षाओं का पालन करने के इच्छुक अर्थशास्त्र के आधार पर आपके पास कई विकल्प हैं।

  1. आप अपने संसाधन के स्वामित्व देने के लिए करना चाहते हैं:

    std::unique_ptr<MyResource> MyClass::releaseResource() { 
        return std::move(this->resource); 
    } 
    
  2. आपको अनन्य स्वामित्व को बनाए रखने के लिए, लेकिन किसी और इसका इस्तेमाल करना चाहते हैं:

    MyResource& MyClass::getResource() { 
        assert(this->resource); 
        return *(this->resource); 
    } 
    
  3. आप करना चाहते हैं शेयर स्वामित्व, इसलिए MyClass दायरे से बाहर हो जाता है तो संसाधन नष्ट नहीं होता है: सब कुछपर स्विच करेंऔर अभी भी मूल्य से वापस आते हैं।

+0

देखें आप तेजी से थे, +1 :-) – Angew

+0

यह उतना ही सही है जितना आप प्राप्त करने जा रहे हैं! –

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