मुझे अभी कुछ गड़बड़ी का एहसास हुआ है। जब भी मैंने एक विधि लिखी है जो एक std::string
पैरामिटर के रूप में स्वीकार करता है , मैंने अपने आप को अपरिभाषित व्यवहार के लिए खोल दिया है।
उदाहरण के लिए, यह ...
void myMethod(const std::string& s) {
/* Do something with s. */
}
... ऐसे कहा जा सकता है ...
char* s = 0;
myMethod(s);
... और इसे रोकने के लिए मैं कुछ भी नहीं कर सकता (जो मुझे पता है)।
तो मेरा सवाल यह है कि कोई इससे खुद का बचाव कैसे करता है?
दिमाग में आने वाला एकमात्र तरीका हमेशा किसी भी विधि के दो संस्करण लिखना है जो std::string
एक पैरामीटर के रूप में स्वीकार करता है , जैसे:
void myMethod(const std::string& s) {
/* Do something. */
}
void myMethod(char* s) {
if (s == 0) {
throw std::exception("Null passed.");
} else {
myMethod(string(s));
}
}
क्या यह एक सामान्य और / या स्वीकार्य समाधान है?
संपादित करें: कुछ ने कहा है कि मुझे एक पैरामीटर const std::string& s
के std::string s
रूप में स्वीकार करना चाहिए । मैं सहमत हूँ। मैंने पोस्ट को संशोधित किया। मुझे नहीं लगता कि हालांकि यह जवाब बदलता है।
char* s = 0
अपरिभाषित है। मैंने इसे अपने जीवन में कम से कम सौ बार (आमतौर पर char* s = NULL
) के रूप में देखा है । क्या आपके पास इसे वापस करने का संदर्भ है?
std:string::string(char*)
कंस्ट्रक्टर से है
const std::string&
उस पैरामीटर के लिए नहीं ले जा सकते ...?)
c_str
संपत्ति की जांच नहीं कर सके ?