मैं किसी फ़ंक्शन के स्मार्ट-पॉइंटर संदर्भ द्वारा ऑब्जेक्ट पास करना चाहता हूं। फ़ंक्शन संदर्भित ऑब्जेक्ट का मान बदल सकता है, लेकिन संदर्भ को स्वयं नहीं बदल सकता है। इसे संभालने के दो स्पष्ट तरीके हैं।पैरामीटर के रूप में एक mutable ऑब्जेक्ट में shared_ptr को कैसे पास करें?
मूल्य_ द्वारा साझा_ptr को पास करने का पहला दृष्टिकोण - संदर्भ संदर्भ है, इसलिए संदर्भ के अनुसार स्वयं को पारित करने की आवश्यकता नहीं है। इसके साथ स्पष्ट मुद्दा संदर्भ की प्रतिलिपि बना रहा है, जो कुछ संदर्भ-गिनती ओवरहेड का सुझाव देता है। shared_ptr उदाहरण की प्रतिलिपि बनाने से परहेज है, लेकिन बजाय कि संदर्भित ऑब्जेक्ट के लिए पहुँचता जिसका अर्थ बजाय अपसंदर्भन एक की दो परतों की जरूरत है -
void foo (shared_ptr<bar> p)
दूसरा दृष्टिकोण स्थिरांक संदर्भ द्वारा shared_ptr पारित करने के लिए है।
void foo (const shared_ptr<bar> &p)
प्रैक्टिस में, ये सैद्धांतिक ओवरहेड सामान्य रूप से तुच्छ और अप्रासंगिक होंगे। जो मुझे बताता है कि प्रत्येक व्यक्ति के लिए एक दृष्टिकोण या दूसरे को चुनने के बजाय, मुझे लगभग हमेशा कुछ मानक सम्मेलन का पालन करना चाहिए। जो सवाल की ओर जाता है ...
क्या कोई मानक सम्मेलन है जिसके लिए मुझे सामान्य रूप से चुनना चाहिए? यदि हां, तो पारंपरिक विकल्प कौन सा है?
संपादित - शायद उल्लेख के लायक - एक कारण पर विचार करने के एक पूर्व मौजूदा सम्मेलन है कि ज्यादातर वर्ग/struct उदाहरणों बल्कि मूल्य की तुलना में स्थिरांक-संदर्भ द्वारा पारित कर रहे हैं क्योंकि पास-दर-स्थिरांक-संदर्भ मामला है, और shared_ptr
एक कक्षा है। बेशक यह हेवीवेट क्लास नहीं है (प्रतिलिपि की लागत छोटी है), इसलिए उस पुराने सम्मेलन के पीछे कारण लागू नहीं हो सकते हैं।
पोस्ट करने से पहले मुझे एक संभावित डुप्लिकेट याद आया - http://stackoverflow.com/questions/5330793/shared-ptr-pass-by-value-vs-pass-by-reference - लेकिन यह किसी विशेष के लिए अधिक विशिष्ट हो सकता है एक सामान्य सम्मेलन के बजाय आवश्यकता। – Steve314
¤ वैसे भी संभव माइक्रो-अक्षमताएं हैं, इसलिए * स्पष्टता * के लिए जाएं। मूल्य से गुजरें। कच्चे सूचक के लिए आप यही करेंगे, यानी यह स्थापित सम्मेलन है। कुछ और पाठक आश्चर्य क्यों करता है। कौन सा गलत होगा, अस्पष्ट। चीयर्स और एचटी।, –
@ एएलएफ - मैं जो कहता हूं उसके बारे में सोच रहा हूं। एक प्रतिक्रिया मेरा संपादन है, लेकिन इसका मतलब यह नहीं है कि मैं असहमत हूं। एक कच्चे संदर्भ को भी संदर्भ द्वारा पारित नहीं किया जा सकता है (हालांकि कच्चे सूचक भी कर सकते हैं), इसलिए मुझे यकीन नहीं है कि "सम्मेलन" सही शब्द है, लेकिन एक अनिवार्य अभ्यास निश्चित रूप से पारंपरिक है। मुझे लगता है कि आपके पास एक बिंदु है, लेकिन मुझे अभी भी संदेह है - सी ++ में, जहां कॉन्स्ट्रेंस द्वारा संरचना/कक्षा के उदाहरणों को पारित करना आमतौर पर किया जाता है (दक्षता कारणों के लिए, लेकिन एक सम्मेलन के रूप में भी), इरादे के बारे में कुछ भी ऐसा करने के लिए कुछ भी करता है? शायद यह हो सकता है, लेकिन शायद किसी भी स्पष्ट/निश्चित तरीके से नहीं। – Steve314