2012-12-14 14 views
5

मैंने हाल ही में अपने कोड में कॉन्स्ट शुद्धता को लागू करने की कोशिश करना शुरू कर दिया है। एक समारोह परिभाषा में, मैं कक्षा LorentzM की एक निरंतर वस्तु के लिए एक निरंतर सूचक फ़ीड:कॉन्स शुद्धता और shared_ptr, डिजाइन की बात है?

void AnalysisObject::SetOwnedPointer(const int maptotree_In, const LorentzM* const momentum_In){ 
owned_pp4_original.reset(momentum_In); 
maptotree=maptotree_In; 
} 

जहां owned_pp4_original

shared_ptr<LorentzM> owned_pp4_original; 

मैं यह कर रहा है, क्योंकि इस समारोह, SetOwnedPointer, बदलने कभी नहीं करना चाहिए LorentzM* momentum_In और न ही उस वस्तु को बदलना चाहिए जो यह इंगित करता है, इसलिए लगातार ऑब्जेक्ट के लिए निरंतर सूचक यह है।

हालांकि, एक shared_ptr वस्तु जहां momentum_In को अंक करने के लिए बनाया गया है, और मैं इस shared_ptr उपयोग करने के लिए वस्तु पर बाद में बदलना चाहते हैं :

void ChangeLorentzM(const double px, const double py, const double pz, const double E){ 
owned_pp4_original->SetPxPyPzE(px,py,pz,E); //THIS CHANGES THE OBJECT 
} 

तो, एक हाथ पर, होना करने के लिए

owned_pp4_original.reset(momentum_In); 

owned_pp4_original एक shared_ptr<const LorentzM>

होना चाहिए, लेकिन फिर, मैं wouldn: ऐसा करने में सक्षम इसके माध्यम से वस्तु को बदलने में सक्षम नहीं होगा।

इस तस्वीर में क्या गलत है?

बहुत बहुत धन्यवाद।

उत्तर

5

मैं यह कर, क्योंकि इस समारोह, SetOwnedPointer, बदलने कभी नहीं करना चाहिए LorentzM * momentum_In और न ही यह वस्तु बदलना चाहिए कि यह है निरंतर वस्तु है, इसलिए लगातार सूचक को यह अंक।

यह पर्याप्त कारण नहीं है। फ़ंक्शन ऑब्जेक्ट को सीधे नहीं बदल सकता है, लेकिन यह ऑब्जेक्ट को संशोधित करने के लिए अन्य ऑब्जेक्ट (shared_ptr) अधिकार प्रदान कर रहा है। यह अधिकार नहीं दे सकता है कि यह स्वयं नहीं है। तो इसे एक पॉइंटर में गैर-कॉन्स ऑब्जेक्ट में बदलें।

यह वही बात है, उदाहरण के लिए, यदि आपके पास ऐसी कक्षा है जिसमें गैर-कॉन्स्ट संदर्भ सदस्य है। आपको अपने कन्स्ट्रक्टर को गैर-कॉन्स्ट ऑब्जेक्ट पास करने की आवश्यकता है, भले ही निर्माता स्वयं ऑब्जेक्ट को संशोधित न करे। कन्स्ट्रक्टर को वस्तु को संशोधित करने के लिए ऑब्जेक्ट के संदर्भ सदस्य अधिकार प्रदान करने की आवश्यकता होती है, और यह ऐसा नहीं कर सकता है यदि उसके पास अधिकार नहीं हैं।

+0

उत्तर के लिए धन्यवाद। तब मैंने कॉन्स्ट शुद्धता के उस हिस्से को गलत समझा। आप जो कहते हैं वह अधिक समझ में आता है। – elelias

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