2012-03-15 13 views
9

Possible Duplicate:
C++ STL set update is tedious: I can't change an element in placestd :: सेट इटरेटर स्वचालित रूप से स्थिरांक

मैं simplicities के लिए समस्या निकाला जाता है और बदला नाम और इसलिए है।

असल में मैं एक वर्ग का दृष्टांत और मैं इसे एक std :: सेट में शेयर, पर बाद में मैं इतना है कि मैं अपने मूल्यों को जांच करने और उन्हें संशोधित कर सकते हैं वर्ग के लिए एक संदर्भ करना चाहते हैं ...

सरलीकृत कोड:

 MyClass tmpClass; 
     std::set<MyClass > setMyClass; 
     setMyClass.insert(tmpClass); 
     std::set<MyClass >::iterator iter; 
     iter=setMyClass.begin(); 
     MyClass &tmpClass2=*iter; 

और त्रुटि:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &' 

(मैं त्रुटि संदेश के कुछ हिस्सों को हटा दिया, "MVB :: भागो ::" यह बहुत स्पष्ट करने के लिए ऊपर।)

अगर मैं जोड़ने के एक पूर्ववर्ती कोड की अंतिम पंक्ति के लिए 'स्थिरांक' तो सब कुछ अच्छी तरह से काम करता है लेकिन फिर मैं मूल्य नहीं बदल सकते ...

इस सामान्य व्यवहार है और मैं करने के लिए, कहते हैं, को दूर किया है डेटा, मूल्यों को बदलें और इसे दोबारा दोबारा डालें?

मुझे लगता है कि सेट के सॉर्टिंग के साथ इसका कुछ संबंध है लेकिन मैं सॉर्टिंग के लिए उपयोग किए जाने वाले चर को स्पर्श नहीं करूंगा।

उत्तर

12

मैं तुम्हें आप won't touch the variables that are used for the sorting आप एक const_cast इस तरह का उपयोग करके यह चारों ओर काम कर सकता था कुछ कर रहे हैं:

MyClass tmpClass; 
    std::set<MyClass > setMyClass; 
    setMyClass.insert(tmpClass); 
    std::set<MyClass >::iterator iter; 
    iter=setMyClass.begin(); 
    const MyClass &tmpClass2=*iter; 

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2); 

वैकल्पिक रूप से, आप वर्ग के सदस्य है कि आप mutable.

+2

के रूप में परिवर्तित करने का इरादा घोषित कर सकता है आप यह कर सकते हैं, लेकिन यह बुरा अभ्यास है। –

12

हां, यह उम्मीद है। यदि आप सेट में पहले से मौजूद ऑब्जेक्ट्स को संपादित करने में सक्षम थे, तो लागू सॉर्ट ऑर्डर अब लागू नहीं हो सकता है, जिससे अपरिभाषित व्यवहार हो सकता है।