कुछ टिप्पणियों में मैंने जो लिखा है उसे स्पष्ट करने के लिए, यहां C12+ कोड में ऐसा करने के लिए का कारण नहीं है।
किसी लिखते हैं, कहते हैं, एक स्ट्रिंग वर्ग और const char*
करने के लिए एक डाली ऑपरेटर जोड़ने का निर्णय:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
यह वह जगह है:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
अब किसी को आँख बंद करके constant == variable
"बचाव की मुद्रा में" प्रोग्रामिंग पैटर्न लागू होता है , आईएमओ, आकस्मिक असाइनमेंट की तुलना में एक और कपटपूर्ण समस्या है क्योंकि आप कॉल साइट से नहीं बता सकते कि कुछ भी स्पष्ट रूप से गलत है।
बेशक, असली सबक हैं:
- अपनी खुद की स्ट्रिंग कक्षाएं न लिखें।
- निहित कलाकारों से बचें, खासकर जब (1) कर रहे हों।
लेकिन कभी-कभी आप तीसरे पक्ष के एपीआई से निपट रहे हैं जिन्हें आप नियंत्रित नहीं कर सकते हैं। उदाहरण के लिए, Windows COM प्रोग्रामिंग में _bstr_t
स्ट्रिंग क्लास सामान्य इस दोष से पीड़ित है।
+1 एक बहुत अच्छा सवाल खिताब के लिए । – OregonGhost
बहुत यकीन है कि मैंने इस प्रश्न को एक से अधिक बार देखा है, हालांकि इसे अभी नहीं मिला है। –
@ इडान: मुझे आश्चर्य हुआ कि मुझे यह नहीं मिला, लेकिन 5 मिनट की खोज के बाद मैंने छोड़ दिया ;-) –