शून्य बिंदुओं के लिए प्रासंगिक उपयोग के मामले हैं
- एक गहरे पेड़ के नोड की तरह कुछ के लिए पुनर्निर्देशन, जो मौजूद नहीं हो सकता है या अभी तक जुड़ा नहीं है। यह एक ऐसी चीज है जिसे आपको हमेशा एक समर्पित वर्ग में घनिष्ठता से रखना चाहिए, इसलिए पठनीयता या संक्षिप्तता यहां एक मुद्दा नहीं है।
गतिशील जाति। बेस-क्लास पॉइंटर को किसी विशेष व्युत्पन्न वर्ग के लिए कास्टिंग करना (ऐसा कुछ जिसे आपको फिर से टालने की कोशिश करनी चाहिए, लेकिन कई बार आवश्यक लग सकता है) हमेशा सफल होता है, लेकिन परिणाम में शून्य वर्ग मेल नहीं खाता है। इसे जांचने का एक तरीका है
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);
if(derived_ptr != nullptr) { ... }
(या, अधिमानतः auto derived_ptr = ...
)। अब, यह बुरा है, क्योंकि यह सुरक्षा की रक्षा करने वाले if
ब्लॉक के दायरे से बाहर (संभवतः अमान्य, शून्य) व्युत्पन्न सूचक को छोड़ देता है । यह आवश्यक नहीं है, क्योंकि C ++ आपको एक if
कॉनडिशन के अंदर बूलियन-परिवर्तनीय चर पेश करने की अनुमति देता है :
if(auto derived_ptr = dynamic_cast<Derived*>(base_ptr)) { ... }
जो न केवल छोटा और गुंजाइश-सुरक्षित है, यह उसके इरादे में भी अधिक स्पष्ट है: जब आप एक अलग-अलग स्थिति में नल की जांच करते हैं, तो पाठक आश्चर्यचकित करता है "ठीक है, इसलिए derived_ptr
यहाँ शून्य नहीं होना चाहिए ... अच्छा, क्यों? यह शून्य हो सकता है? जबकि एक लाइन संस्करण बहुत स्पष्ट रूप से कहते हैं, "यदि आप सुरक्षित रूप से डाल सकता base_ptr
करने के लिए Derived*
है, तो के लिए इसका इस्तेमाल करते हैं ..."।
वही काम करता है जो किसी अन्य संभावित-विफलता ऑपरेशन के लिए भी होता है जो एक पॉइंटर लौटाता है, हालांकि आईएमओ आपको आम तौर पर इससे बचना चाहिए: यह boost::optional
संभव है कि पॉइंटर्स के बजाय संभवतः विफल संचालन के परिणामों के लिए "कंटेनर" की तरह कुछ का उपयोग करें ।
तो, अशक्त संकेत के लिए मुख्य उपयोग के मामले हमेशा निहित कलाकारों शैली की भिन्नता में लिखा जाना चाहिए अगर, मैं एकरूपता बनाए रखने के लिए यह अच्छा करने के लिए कहेंगे हमेशा इस शैली का उपयोग, अर्थात् मैं के लिए की वकालत करता हूँ if(ptr)
से अधिक if(ptr!=nullptr)
।
मुझे डर है कि मुझे एक विज्ञापन के साथ समाप्त होना है: if(auto bla = ...)
वाक्यविन्यास वास्तव में ऐसी समस्याओं के वास्तविक समाधान के लिए थोड़ा बोझिल सन्निकटन है, पैटर्न मिलान । आप पहले कुछ एक्शन (जैसे पॉइंटर डालने) को क्यों बाध्य करेंगे और फिर विचार करेंगे कि कोई विफलता हो सकती है ... मेरा मतलब है, यह हास्यास्पद है, है ना? यह पसंद है, आपके पास कुछ खाद्य पदार्थ हैं और सूप बनाना चाहते हैं। आप इसे रस निकालने के लिए अपने सहायक को सौंपते हैं, अगर यह एक नरम सब्जी होती है। आप इसे पहले नहीं देखते हैं। जब आपके पास एक आलू होता है, तब भी आप इसे अपने सहायक को दे देते हैं, लेकिन वे इसे एक असफल नोट के साथ आपके चेहरे पर वापस थप्पड़ मारते हैं। आह, अनिवार्य प्रोग्रामिंग!
बहुत बेहतर: सही उन सभी मामलों पर विचार करें जिनसे आप मुठभेड़ कर सकते हैं। फिर उसके अनुसार कार्य करें। हास्केल:
makeSoupOf :: Foodstuff -> Liquid
makeSoupOf p@(Potato{..}) = mash (boil p) <> water
makeSoupOf vegetable
| isSoft vegetable = squeeze vegetable <> salt
makeSoupOf stuff = boil (throwIn (water<>salt) stuff)
हास्केल के पास विशेष उपकरण भी हैं, जब वास्तव में विफलता की एक गंभीर संभावना है (साथ ही अन्य सामान की एक पूरी गुच्छा के लिए): सनक। लेकिन यह उन लोगों को समझाने की जगह नहीं है।
⟨/ Advert⟩
0
या उसके विरुद्ध परीक्षण करनाnullptr
। (NULL
एक C'ism है, और एक हेडर फ़ाइल शामिल करने की आवश्यकता है।)