const
-correctness करने का चुनौतियों में से एक आप इसे आधे रास्ते नहीं कर सकता है। यह सब कुछ या कुछ भी नहीं है। यदि आप इसे आधे रास्ते में करने का प्रयास करते हैं, तो आप यहां एक कठिन स्थान पर पहुंच जाते हैं जैसे आप यहां हैं। आप एक अच्छा const
-correct वर्ग कुछ पागल पुराने द्वारा किया जा रहा है, आम तौर विरासत (या एक पुराने crummudgeon द्वारा लिखित) कोड है कि const
-correct नहीं है के साथ खत्म हो और यह सिर्फ काम नहीं करता। आप सोच रहे हैं कि const
- सहीता सभी परेशानी के लायक है।
I need to call a non-const method [from a const method]
आप सीधे नहीं कर सकते हैं। न ही आपको चाहिए हालांकि, एक विकल्प है ...
जाहिर है आप const
विधि से एक गैर-const
विधि को कॉल नहीं कर सकते हैं। अन्यथा, सदस्य कार्यों पर लागू होने पर const
का कोई अर्थ नहीं होगा।
ए const
सदस्य फ़ंक्शन mutable
चिह्नित सदस्य चर बदल सकता है, लेकिन आपने संकेत दिया है कि यह आपके मामले में संभव नहीं है।
आप SomeClass* me = const_cast<SomeClass*>(this);
की तरह कुछ करने से दूर const
सत्ता कास्ट करने के लिए प्रयास कर सकता है लेकिन ए) यह आमतौर पर यूबी में परिणाम होगा, या 2) यह const
-correctness के पूरे विचार का उल्लंघन करती है।
एक चीज जो आप कर सकते हैं, यदि आप वास्तव में पूरा करने की कोशिश कर रहे हैं तो इसका समर्थन होगा, गैर-const
प्रॉक्सी ऑब्जेक्ट बनाना है, और इसके साथ सामान const
नहीं है। बुद्धि के लिए:
#include <iostream>
#include <string>
using namespace std;
class Gizmo
{
public:
Gizmo() : n_(42) {};
void Foo() const;
void Bar() { cout << "Bar() : " << n_ << "\n"; }
void SetN(int n) { n_ = n; };
int GetN() const { return n_; }
private:
int n_;
};
void Gizmo::Foo() const
{
// we want to do non-const'y things, so create a proxy...
Gizmo proxy(*this);
int save_n = proxy.GetN();
proxy.SetN(save_n + 1);
proxy.Bar();
proxy.SetN(save_n);
}
int main()
{
Gizmo gizmo;
gizmo.Foo();
}
स्रोत
2011-11-30 18:17:55
क्या यह एक कॉन्स फ़ंक्शन होने के मुख्य नियम के खिलाफ नहीं होगा? – DumbCoder
@ डंबकोडर, बाहर से, यह एक कॉन्स फ़ंक्शन है जिसमें क्लाइंट को दिखाई देने वाला कुछ भी नहीं बदला गया है। –
एक गैर-कॉन्स्ट विधि का तात्पर्य है कि यह आपके ऑब्जेक्ट में कुछ डेटा बदल रहा है। यदि 'someMethod()' एक गैर-कॉन्स्ट विधि को कॉल करता है, तो यह अप्रत्यक्ष रूप से डेटा बदल रहा है। तो वास्तव में, 'कुछ विधि()' बस 'const' नहीं होना चाहिए। –